使用scala更新大文本文件中的行

时间:2013-07-19 07:04:20

标签: scala large-data bigdata

我有一个43GB左右的大文本文件.ttl包含以下形式的三元组:

<http://www.wikidata.org/entity/Q1001> <http://www.w3.org/2002/07/owl#sameAs> <http://la.dbpedia.org/resource/Mahatma_Gandhi> .
<http://www.wikidata.org/entity/Q1001> <http://www.w3.org/2002/07/owl#sameAs> <http://lad.dbpedia.org/resource/Mohandas_Gandhi> .

我希望找到更新文件内特定行的最快方法,而无需重写所有下一个文本。通过更新或删除它并将其附加到文件的末尾

访问特定行我使用此代码:

val lines = io.Source.fromFile("text.txt").getLines
val seventhLine = lines drop(10000000) next

1 个答案:

答案 0 :(得分:1)

如果您想使用文本文件,请考虑每行/记录的固定长度/记录大小。

通过这种方式,您可以使用RandomAccessFileseek按行编号分隔每行的确切位置:您只需查找line * LineSize,然后进行更新。

如果你必须插入一个新行,那将无济于事。其他限制是:文件大小会增加(因为固定的记录长度),并且总会有一条记录太大。

至于初始转换:

  • 获取当前文件的最大行长度,然后添加10%。
  • 现在你必须转换一次文件:从文本文件中读取一行,并将其转换为固定大小的记录。
  • 您可以使用|之类的特殊字符来分隔字段。如果可能,请使用类似;的内容,以便获得.csv文件
  • 我建议用空格填充剩下的空格,所以它看起来仍然像一个文本文件,可以用shell实用程序解析。
  • 您可以使用\n来终止记录。

例如

http://x.com|http://x.com|http://x.com|...\n

http://x.com;http://x.com;http://x.com;...\n

其中每个.代表一个空格字符。所以它仍然以某种方式与“普通”文本文件兼容。


另一方面,查看您的数据时,请考虑使用像Redis这样的键值数据存储:您可以使用行号或第一个URL作为键。