如何提高处理维基百科数据和大量网页的性能?

ghhkc1vu  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(426)

我应该使用维基百科的文章链接数据转储从一个组织的网站上提取代表性术语。为了做到这一点,我-
爬网和下载组织的网页(~110,000)
创建了维基百科id和术语/标题的字典(~4000万条记录)
现在,我应该使用字典来处理每个网页,以识别术语并跟踪它们的术语ID和频率。
为了使词典能放进内存,我把词典分成了几个小文件。基于我对一个小数据集的实验,上面的处理时间大约是75天。
这只是一个组织。我要为40多个孩子做同样的事。
实施-
在内存中存储字典的hashmap。
使用boyer-moore搜索实现在每个Map条目中循环搜索网页中的术语。
对每个网页重复上述操作,并将结果存储在hashmap中。
我尝试过优化代码和调优jvm以获得更好的性能。
能否有人建议一个更有效的方法来实现上述,减少处理时间到几天。
hadoop是一个值得考虑的选项吗?

q5lcpyga

q5lcpyga1#

仅使用mr的方法之一是:
假设您已经有n个适合内存的较小的字典,您可以:启动n个“仅Map”作业,该作业将扫描所有数据(每个作业只有一个字典)并输出smth,如{pageid,termid,occurrence,etc}到folder/your\tmp\u folder/n/这样,您将有n*m个文件,其中m是每个阶段上的Map器数量(应该相同)。
然后第二个作业将简单地分析{pageid,termid,occurrence,etc}对象并构建每个页面id的统计信息。
仅Map作业在您的情况下应该非常快。如果没有-请粘贴您的代码。

z9smfwbn

z9smfwbn2#

根据你的问题:

Number of Documents = 110000

Dictionary => List of [TermID, Title Terms] = 40million entries

Size of documents = 11000 * 1KB per document on an average =  26.9GB
(1KB per document on an average)

Size of dictionary = 40million * 256bytes = 9.5GB of raw data
(256bytes per entry on an average)

你是怎么得出75天的估计数的?
有许多绩效目标:
你是如何储存这些文件的?
你如何储存/检索这本词典假设不是所有的记忆,除非你负担得起)
你在几台机器上运行它?
你在同时进行字典查找吗当然,假设字典是不可变的,一旦你已经处理了整个维基百科)
以下是我认为你正在做的事情的概要:

dictionary = read wikipedia dictionary
document = a sequence of documents
documents.map { doc =>
  var docTermFreq = Map[String, Int]()
  for(term <- doc.terms.map if(dictionary.contains(term)) ) {
     docTermFreq = docTermFreq + (term -> docTermFreq.getOrElse(term, 0) + 1)
  }
  // store docTermFreq map
}

这实际上是将每个文档分解成令牌,然后在维基百科字典中查找其令牌的存在。
这正是lucene分析仪所做的。
lucene标记器将文档转换为标记。这发生在术语被索引到lucene之前。因此,您所要做的就是实现一个分析器,它可以查找wikipedia字典,判断字典中是否有令牌。
我会这样做:
获取每个文档并准备一个令牌流(使用上面描述的分析器)
索引文档术语。
此时,在lucene索引中只有wikipedia术语。
当您这样做时,您将拥有来自lucene索引的现成统计信息,例如:
术语的文档频率
术语频率向量(正是您需要的)
和一个随时可用的倒排索引快速介绍倒排索引和检索)
你可以做很多事情来提高性能。例如:
并行化文档流处理。
您可以将字典存储在诸如berkeylydb或kyoto cabinet之类的键值数据库中,甚至可以存储在诸如redis或memcache之类的内存键值存储中。
我希望这有帮助。

相关问题