1

我在 .ttl 中有一个大约 43GB 的大文本文件,其中包含以下形式的三元组:

<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
4

1 回答 1

1

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

这样,您可以使用RandomAccessFiletoseek到每行按数字的确切位置:您只需寻找 to line * LineSize,然后更新它。

如果您必须插入新行,它不会真正有帮助。其他限制是:文件大小会增长(因为固定的记录长度),并且总会有一个记录太大。

至于初始转换:

  • 获取当前文件的最大行长,例如加10%。
  • 现在您必须转换一次文件:从文本文件中读取一行,并将其转换为固定大小的记录。
  • 您可以使用特殊字符|来分隔字段。如果可能的话,使用类似的东西;,这样你就会得到一个 .csv 文件
  • 我建议用空格填充剩余的空间,所以它看起来仍然像一个文本文件,您可以使用 shell 实用程序对其进行解析。
  • 您可以使用 a\n来终止记录。

例如

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

或者

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

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


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

于 2013-07-19T07:31:01.343 回答