【问题标题】:indexing of large text files line by line for fast access逐行索引大型文本文件以实现快速访问
【发布时间】: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 文本文件的行数,不用说这样做需要数年时间。

我想优化什么:

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

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

缺点是索引也可能比较大,考虑到我们将有另一个索引用于特定行号的访问,加上重载我没有尝试性能

  1. 为所有三元组的每个键(如Q1000.txt)制作一个文本文件,其中包含主题Q1000,并逐个迭代它们并进行组合

缺点:这似乎是最快且内存消耗最少的一个,但肯定会创建大约 1000 万个文件并访问它们将是一个问题,是否有替代方案?

我正在为任务使用scala 脚本

【问题讨论】:

  • 不使用数据库可能是有原因的,但实际上您要实现一个。此context 中的相关问题

标签: scala indexing bigdata line-by-line


【解决方案1】:

将 43GB 文件分成适合内存的块,然后按主题进行排序。分别编写块。

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

现在你只需要通过排序的数据来收集主题组。

应该占用 O(n) 空间和 O(n log n) 时间,对于这种事情你应该能够负担得起。

【讨论】:

  • 要在最小复杂度 o(nlogn) 中进行合并排序,这将需要文件数等于主题数 ~10M 文件,最大文件可以创建接近 32K,这是非常远的从此
  • @HadyElsahar - n 是行数,而不是主题数。该策略与受试者数量无关。这是标准的分而治之,O(n log n),不管文件的数量是多少。
【解决方案2】:

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

有一个有趣的库Apache CrunchScala API。我自己没有使用过,但它看起来可以很好地解决你的问题。你的台词会根据他们的主题分开,然后

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多