我有一个非常大的文本文件,大约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文本文件的行数,不用说这需要数年才能完成。
我想要优化的内容:
加载HashMap [String,IntArray],用于索引每个键的外观行,并使用任何库按行号访问文件,例如:
Q1000 | 1,2,433
Q1001 | 2334,323,2124
缺点是索引也可能相对较大,考虑到我们将为具有特定行号的访问提供另一个索引,加上重载i没有尝试性能
Q1000.txt
等每个键创建一个文本文件,其中包含主题Q1000
,并逐个迭代它们并进行组合缺点:这似乎是最快的一个和最少的内存消耗,但肯定会创建大约1000万个文件并访问它们将是一个问题,是否有替代方案?
我正在使用scala
脚本执行任务
答案 0 :(得分:2)
将43GB文件放在适合内存的块中并按主题排序。分别写下块。
在块上运行合并排序(按主题排序)。这很简单:你有两个文件的输入迭代器,你写出任何较少的输入,然后再读取那个(如果有的话)。
现在您只需要通过排序数据进行一次传递即可收集主题组。
应该花费O(n)空间和O(n log n)时间,这对于你应该能够承担的这种事情。
答案 1 :(得分:1)
可能的解决方案是使用一些现有的map-reduce库。毕竟,你的任务正是map-reduce的用途。即使您没有在多台计算机上并行化计算,主要优势在于它可以为您处理拆分和合并的管理。
有一个有趣的图书馆Apache Crunch Scala API。我自己没有用它,但看起来它可以很好地解决你的问题。你的线将根据他们的主题分开然后