【发布时间】:2020-12-24 06:58:00
【问题描述】:
是否可以通过一定数量的流来压缩数据,即无需一次将所有压缩数据加载到内存中?
例如,我可以在具有 2gb 内存的机器上 gzip 压缩一个 10gb 的文件吗?
在https://docs.python.org/3/library/gzip.html#gzip.compress,gzip.compress函数返回gzip的字节,所以必须全部加载到内存中。但是......尚不清楚gzip.open 在内部是如何工作的:压缩后的字节是否会立即全部存储在内存中。 gzip 格式本身是否使实现流式 gzip 变得特别棘手?
[此问题使用 Python 标记,但也欢迎非 Python 答案]
【问题讨论】:
-
不,gzip 不需要加载所有内容。它被设计为作为流工作。
gzip.open()返回的对象是一个生成器,根据需要返回数据。 -
@Barmar "returns the data":确认一下,我不是在问解压缩(我很确定 gzip can 以流方式解压缩),而是关于压缩.
-
不要使用
compress()或decompress()方法。使用gzip.open()和mode='w'将写入压缩文件。您还可以使用底层的GzipFile()类来写入任何文件对象。 -
或者您可以使用
compress(),但您不必一次压缩所有内容。您可以分块读取文件,并分别压缩每个块。但是您可能无法获得那么好的压缩效果。
标签: python compression gzip