在Java中随机访问文本文件



我正在解析一个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行?

你的问题假设你的JSON有行结尾,这很可能是没有的。如此大的文件可能会删除所有不需要的字符,并且在JSON文件中当然不需要行尾。

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

最新更新