【问题标题】:How to read compressed(.gz) file faster using Pandas/Dask?如何使用 Pandas/Dask 更快地读取压缩(.gz)文件?
【发布时间】:2019-08-08 23:41:39
【问题描述】:

我有几个(每个 3.5GB)gzip 文件,目前我正在使用 Pandas 读取这些文件,但速度很慢,我也尝试过 Dask,但它似乎不支持 gzip 文件破坏.有没有更好的方法来快速加载这些海量的 gzip 文件?

Dask 和 Pandas 代码:

df = dd.read_csv(r'file', sample = 200000000000,compression='gzip')

我希望它尽快读取整个文件。

【问题讨论】:

  • gzip 解压缩只有在压缩器被配置为每隔一段时间重置其表时才能天生并行化。否则,必须从头到尾阅读才能获得必要的状态来理解内存中的流。请参阅pigz 作为提供此类压缩器和解压缩器的并行 gzip 实现(在 C 中);但是,如果您无法更改压缩端使用的工具和设置,那么您在解压端所做的任何事情都不会有什么好处。
  • ...坦率地说,如果您可以更改压缩端使用的工具,最好让它们从 gzip 切换。查看facebook.github.io/zstd 的基准,尤其是用于解压的基准。
  • 我不确定 Pandas 但gzip 模块是用纯 python 实现的,所以它肯定会很慢。也许 pypy 可以给你一个加速。归根结底,您正在尝试解压缩几个千兆字节的文件并将其未压缩的数据全部存储在内存中。这需要时间。如果可能,请考虑流式传输数据。

标签: python pandas gzip dask


【解决方案1】:

gzip 本质上是一种非常缓慢的压缩方法,并且(如您所说) 支持随机访问。这意味着,到达位置 x 的唯一方法是从头开始扫描文件,这就是 Dask 在这种情况下不支持尝试并行化的原因。

如果您想至少使用并行解析,最好的办法是首先解压缩整个文件,这样分块机制才有意义。你也可以把它分成几个文件,然后压缩每个文件,这样所需的总空间就差不多了。

请注意,理论上,一些支持逐块随机访问的压缩机制,但我们还没有找到任何具有足够社区支持的机制来在 Dask 中实现它们。

不过,最佳答案是以 parquet 或 orc 格式存储您的数据,这种格式具有内部压缩和分区功能。

【讨论】:

    【解决方案2】:

    一种选择是为 python 使用包 datatablehttps://github.com/h2oai/datatable

    使用函数fread,它可以比pandas(到gzip)读/写快得多,例如

    import datatable as dt
    df = dt.fread('file.csv.gz')
    

    以后,可以convert它到pandas数据框:

    df1 = df.to_pandas()
    

    目前数据表只有available on Linux/Mac

    【讨论】:

      【解决方案3】:

      您可以尝试使用 gzip 库:

      import gzip
      f = gzip.open('Your File', 'wb')
      file_content = f.read()
      print (file_content)
      

      python: read lines from compressed text files

      【讨论】:

      • f.read() 将加载和解压缩 3.5GB 的磁盘数据,因此即使这不会使您的会话崩溃,尝试将其全部打印出来也是如此。
      猜你喜欢
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2021-03-31
      • 1970-01-01
      • 2021-10-24
      相关资源
      最近更新 更多