Java中随机访问文本文件

问题描述 投票:0回答:1

我正在解析一个 1.4 TB 的非常大的 JSON 文件(这是一个 WikiData 转储以防万一)。它是如此之大,以至于即使在像这样的优化的帮助下,即使是简单的行计数也需要永远 Java 文件中的行数 为了加快速度,我将拆分任务并使用两个不同的 SSD 在我的主机(所以我可能会获得一些额外的磁盘吞吐量)和我拥有的其他计算机(可能使用 Apache Spark)。

问题是我如何从随机位置开始读取文件?跳过这些行显然不是一个选项 :)。而且我还想尽量避免对该文件进行物理拆分。它实际上是最简单、流量/磁盘空间效率最高的解决方案,但我想探索一些角落用例的替代方案。

基本上我会做以下事情:

JsonParser jp = f.createParser(new File(inputFile));
while(jp.nextToken() != JsonToken.END_OBJECT) {
     //Fancy stuff
}

有没有办法快速跳转到#20,000,000行?

java json jackson text-files
1个回答
0
投票

您的问题假定您的 JSON 有行结尾,而它很可能不会。如此大的文件可能会从所有不需要的字符中删除,并且 JSON 文件中肯定不需要行结尾。

您已经在使用 Jackson Streaming API,这很好,因为这是您处理如此大文件的唯一机会。 虽然您无法定位到某一行,但您可以使用 RandomAccessFile.html#seek(long) 定位到某个(字节)位置。您需要“猜测”您要跳转到的位置(根据总文件大小)。 由于您的搜索可能会放置在随机位置(例如在属性值内),您可能需要首先使用一些自定义解析规则来找到一个有效的起点,让 JSON 流解析器启动。一旦你弄清楚你在 JSON 中的确切时间,你就可以像往常一样使用解析器。

© www.soinside.com 2019 - 2024. All rights reserved.