逐行索引大型文本文件以便快速访问

时间:2013-07-19 03:02:26

标签: scala indexing bigdata line-by-line

我有一个非常大的文本文件,大约43GB,我用它来处理它们以生成不同形式的另一个文件。我不想设置任何数据库或任何索引搜索引擎

数据采用.ttl格式

<http://www.wikidata.org/entity/Q1000> <http://www.w3.org/2002/07/owl#sameAs> <http://nl.dbpedia.org/resource/Gabon> .
<http://www.wikidata.org/entity/Q1000> <http://www.w3.org/2002/07/owl#sameAs> <http://en.dbpedia.org/resource/Gabon> .
<http://www.wikidata.org/entity/Q1001> <http://www.w3.org/2002/07/owl#sameAs> <http://lad.dbpedia.org/resource/Mohandas_Gandhi> .
<http://www.wikidata.org/entity/Q1001> <http://www.w3.org/2002/07/owl#sameAs> <http://lb.dbpedia.org/resource/Mohandas_Karamchand_Gandhi> .

目标是生成所有共享相同主题的三元组的所有组合:

例如主题Q1000:

<http://nl.dbpedia.org/resource/Gabon> <http://www.w3.org/2002/07/owl#sameAs> <http://en.dbpedia.org/resource/Gabon> .
<http://en.dbpedia.org/resource/Gabon> <http://www.w3.org/2002/07/owl#sameAs> <http://nl.dbpedia.org/resource/Gabon> .

问题: Dummy代码的开头是迭代复杂度O(n ^ 2),其中n是45GB文本文件的行数,不用说这需要数年才能完成。

我想要优化的内容:

  1. 加载HashMap [String,IntArray],用于索引每个键的外观行,并使用任何库按行号访问文件,例如:

    Q1000 | 1,2,433
    Q1001 | 2334,323,2124

  2. 缺点是索引也可能相对较大,考虑到我们将为具有特定行号的访问提供另一个索引,加上重载i没有尝试性能

    1. 为所有三元组的Q1000.txt等每个键创建一个文本文件,其中包含主题Q1000,并逐个迭代它们并进行组合
    2. 缺点:这似乎是最快的一个和最少的内存消耗,但肯定会创建大约1000万个文件并访问它们将是一个问题,是否有替代方案?

      我正在使用scala脚本执行任务

2 个答案:

答案 0 :(得分:2)

将43GB文件放在适合内存的块中并按主题排序。分别写下块。

在块上运行合并排序(按主题排序)。这很简单:你有两个文件的输入迭代器,你写出任何较少的输入,然后再读取那个(如果有的话)。

现在您只需要通过排序数据进行一次传递即可收集主题组。

应该花费O(n)空间和O(n log n)时间,这对于你应该能够承担的这种事情。

答案 1 :(得分:1)

可能的解决方案是使用一些现有的map-reduce库。毕竟,你的任务正是map-reduce的用途。即使您没有在多台计算机上并行化计算,主要优势在于它可以为您处理拆分和合并的管理。

有一个有趣的图书馆Apache Crunch Scala API。我自己没有用它,但看起来它可以很好地解决你的问题。你的线将根据他们的主题分开然后