<p>真奇怪。如果您试图压缩一个不包含许多换行符的大型二进制文件,我会预料到这个错误,因为这样的文件可能包含一个对RAM来说太大的“行”,但它不应该出现在一个行结构的.csv文件上。</p>
<p>但是无论如何,逐行压缩文件不是很有效。即使操作系统缓冲磁盘I/O,但读取和写入更大的数据块(如64KB)通常要快得多。</p>
<p>我在这台机器上有2GB的RAM,我刚刚成功地用下面的程序压缩了一个2.8GB的tar文件。</p>
<pre><code>#! /usr/bin/env python
import gzip
import sys
blocksize = 1 << 16 #64kB
def gzipfile(iname, oname, level):
with open(iname, 'rb') as f_in:
f_out = gzip.open(oname, 'wb', level)
while True:
block = f_in.read(blocksize)
if block == '':
break
f_out.write(block)
f_out.close()
return
def main():
if len(sys.argv) < 3:
print "gzip compress in_file to out_file"
print "Usage:\n%s in_file out_file [compression_level]" % sys.argv[0]
exit(1)
iname = sys.argv[1]
oname = sys.argv[2]
level = int(sys.argv[3]) if len(sys.argv) > 3 else 6
gzipfile(iname, oname, level)
if __name__ == '__main__':
main()
</code></pre>
<p>我正在运行Python 2.6.6,<code>gzip.open()</code>不支持<code>with</code>。</p>
<hr/>
<p>正如Andrew Bay在注释中所指出的,<code>if block == '':</code>在Python 3中无法正常工作,因为<code>block</code>包含字节,而不是字符串,并且空字节对象与空文本字符串不相等。我们可以检查块的长度,或者与<code>b''</code>(这在Python 2.6+中也适用)进行比较,但是简单的方法是<code>if not block:</code>。</p>