【问题标题】:Scala: Reading a huge zipped text file line by line without loading into memoryScala:逐行读取一个巨大的压缩文本文件而不加载到内存中
【发布时间】:2021-05-24 21:09:43
【问题描述】:

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

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

【问题讨论】:

    标签: scala io compression


    【解决方案1】:

    如果文件是 Gzipped,java 的 GzipInputStream 为您提供流式访问:

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

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

    【讨论】:

    • 非常感谢,非常有帮助。我必须将案例更改为 GZIPInputStream 才能使其正常工作。
    【解决方案2】:

    考虑better-files,它会在压缩文件中提供Iterator

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

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

    【讨论】:

    • 感谢您的回复。 Dima 的建议是内置库,所以它更容易使用,但我不知道更好的文件,它非常通用和强大。学到了一些非常有用的东西。
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多