Scala:逐行读取一个巨大的压缩文本文件而不加载到内存中

Scala: Reading a huge zipped text file line by line without loading into memory

我有一个大小为 100-200 GB 的文本文件。所以我希望以压缩格式(例如zip)存储。但是,由于它的大小,我需要一次处理一行。虽然使用 io.Source.fromFile(fileName).getLines 一次一行地读取文本文件很简单,但这仅适用于解压缩的文件。

有什么有效的方法可以在scala中逐行读取压缩文件吗?我找不到任何示例,但我看到的更接近的实现是 here 但它将文件加载到内存中。与通常给出的使用 zip 存档的示例不同,我只需要处理一个压缩的文本文件。如果有任何指点或线索,我将不胜感激。

考虑 better-files,它给压缩文件 Iterator

import better.files._
File("foo.gz").newInputStream.asGzipInputStream().lines
// : Iterator[String]

因此您可以逐行处理文件,而无需将其整个加载到内存中。

如果文件是 Gzipped,java 的 GzipInputStream 给你流媒体访问:

   val lines: Iterator[String] = Source
     .fromInputStream(new GzipInputStream(new FileInputStream("foo.gz")))
     .getLines

如果它是一个 zip 存档 正如你的问题所暗示的那样,那就更复杂了。 Zip 存档更像是文件夹而不是单个文件。您必须先阅读 table 的内容,然后浏览条目以找到您想要阅读的内容(或阅读所有内容)。类似于