【发布时间】:2013-07-18 05:29:58
【问题描述】:
我有一个大约 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> .
问题: 开始的虚拟代码以复杂度 O(n^2) 进行迭代,其中 n 是 45GB 文本文件的行数,不用说这样做需要数年时间。
我想优化什么:
-
加载一个 HashMap [String,IntArray] 用于索引每个键的外观行,并使用任何库按行号访问文件,例如:
Q1000 | 1,2,433
Q1001 | 2334,323,2124
缺点是索引也可能比较大,考虑到我们将有另一个索引用于特定行号的访问,加上重载我没有尝试性能
- 为所有三元组的每个键(如
Q1000.txt)制作一个文本文件,其中包含主题Q1000,并逐个迭代它们并进行组合
缺点:这似乎是最快且内存消耗最少的一个,但肯定会创建大约 1000 万个文件并访问它们将是一个问题,是否有替代方案?
我正在为任务使用scala 脚本
【问题讨论】:
-
不使用数据库可能是有原因的,但实际上您要实现一个。此context 中的相关问题
标签: scala indexing bigdata line-by-line