如何提高使用维基百科数据时的性能和巨大的数据。 的网页?

我应该使用维基百科的文章链接数据转储从组织的网站中提取代表性术语。 要做到这一点,我 –

  1. 已抓取并下载的组织的网页。 (〜11万)
  2. 创建了维基百科ID和术语/标题的字典。 (约4,000万条记录)

现在,我应该使用字典处理每个网页,以识别术语并跟踪他们的术语ID和频率。

为了使字典适合内存,我将字典拆分为较小的文件。 根据我对小型数据集的实验,上述处理时间约为75天。

这仅适用于1个组织。 我必须为40多个人做同样的事情。

实施 –

  • HashMap用于在内存中存储字典。
  • 使用Boyer-Moore搜索实现循环遍历每个地图条目以在网页中搜索术语。
  • 对每个网页重复上述操作,并将结果存储在HashMap中。

我已经尝试优化代码并调整JVM以获得更好的性能。

有人可以建议更有效地实施上述方法,将处理时间缩短到几天。

Hadoop是一个可以考虑的选择吗?

根据您的问题:

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 Analyzer的function。

Lucene Tokenizer会将文档转换为标记。 这是在将术语索引到lucene之前发生的。 因此,您所要做的就是实现一个分析器,它可以查找维基百科词典,以查找令牌是否在字典中。

我会这样做:

  • 获取每个文档并准备令牌流(使用上述分析器)
  • 索引文档术语。
  • 此时,您将只在Lucene索引中使用维基百科术语。

执行此操作时,您将获得Lucene Index的现成统计数据,例如:

  • 文件的术语频率
  • TermFrequencyVector (正是你需要的)
  • 和一个随时可用的倒排索引! (快速介绍反向索引和检索 )

您可以做很多事情来改善性能。 例如:

  • 并行化文档流处理。
  • 您可以将字典存储在键值数据库(如BerkeylyDB或Kyoto Cabinet)中,甚至可以存储在内存中的键值存储(如Redis或Memcache)中 。

我希望有所帮助。

仅使用MR的方法之一是:

假设你已经拥有适合内存的N个字典,那么你可以:启动N个“仅映射”作业,扫描所有数据(每个只有一个字典)并输出像{pageId,termId,occurence等一样的smth }到文件夹/ your_tmp_folder / N /结果你将有N * M个文件,其中M是每个阶段的映射器数量(应该是相同的)。

然后第二个工作将简单地分析您的{pageId,termId,occurence等}对象并构建每页ID的统计数据。

在您的情况下,仅映射作业应该非常快。 如果没有 – 请粘贴您的代码。