【问题标题】:Is Python's gzip.writer known to be slow?众所周知,Python 的 gzip.writer 很慢吗?
【发布时间】:2020-04-07 23:42:26
【问题描述】:

我编写了一个脚本来为我的雇主处理 CSV 文件。该处理受 CPU 限制且文件很大。例如,3+ GB 的输入会产生 6+ GB 的输出。

在我的机器上,该文本文件的转换需要将近 16 分钟(这本身有点长,但我使用的是股票 csv-module),其中大约 30 秒用于操作系统(编写输出)。

为了好玩,我添加了透明压缩功能:

if name.endswith('.gz'):
    import gzip
    return gzip.GzipFile(name, mode, 9, fd)
return fd

使用压缩时,运行时间会跳到一个多小时——尽管系统时间减半,因为要写的东西要少得多。

跳跃是可以理解的,但它的规模不是——如果我只是在未压缩的输出文件上运行gzip -9,它只需要大约 13 分钟。

我可以理解,gzip 可能会通过使用更大的缓冲区等来赢得一些东西——但在我的脚本中嵌入压缩应该能够从更少的数据复制中受益。然而,它比 2:1 的损失更糟糕:16 分钟转换 + 13 分钟压缩与 61 分钟一次性完成。

为什么会有这么大的差异? Python-2.x 中的 zlib/gzip 代码是否已知很慢? Python-3 在这方面是否应该更好——它在未压缩处理方面明显更差......

【问题讨论】:

  • 是的,这很慢,因为GIL realpython.com/python-gil
  • 你的操作系统是什么?
  • 我在 FreeBSD 和 Linux 上都试过——两种操作系统上的时间差异是相当的。我不明白,GIL 与它有什么关系——我的代码中没有任何东西是多线程的,它一次处理一个文件。
  • 我在 Python 3.8 上,我仍然怀疑 Python 的 gzipping 很慢......

标签: python python-3.x python-2.7 compression gzip


【解决方案1】:

我的一位同事注意到 Python 的 gzip 和 bash 的 gzip 的默认压缩级别不同。

Python's implementation 默认使用压缩级别 9(最慢)

gzip.open(filename, mode='rb', compresslevel=9, encoding=None, errors=None, newline=None)

bash gzip command 默认使用 6 级:

默认压缩级别为 -6(即以牺牲速度为代价偏向高压缩)。

【讨论】:

  • 哦,我刚刚注意到您实际上在您的问题中帐户 了解压缩级别。所以也许这不是问题的根源......
  • ...而且也没有“bash gzip 命令”这样的东西:-)
猜你喜欢
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 2011-02-07
  • 2016-12-25
  • 1970-01-01
  • 2011-01-07
  • 2010-10-31
  • 1970-01-01
相关资源
最近更新 更多