这很奇怪。如果您试图压缩一个没有包含许多换行符的大型二进制文件,因为这样的文件可能包含一个太大而无法适应您的RAM的“行”,那么我会期望出现这个错误,但是在一个按行结构化的 .csv 文件上不应该发生这种情况。
但是无论如何,逐行压缩文件并不是非常有效的。尽管操作系统缓冲磁盘I / O,但通常读写更大的数据块(例如64 kB)要快得多。
我在这台机器上有2GB的RAM,并且我刚刚成功使用下面的程序压缩了一个2.8GB的tar存档。
import gzip
import sys
blocksize = 1 << 16
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()
我正在使用Python 2.6.6,gzip.open()
不支持with
语句。
正如Andrew Bay在评论中指出的那样,在Python 3中,if block == '':
将无法正确工作,因为block
包含的是字节而不是字符串,并且空字节对象与空文本字符串不相等。我们可以检查块大小或将其与b''
进行比较(这也适用于Python 2.6+),但简单的方法是if not block:
。
f_out.writelines
,因为你使用的是write
… - Serge BallestaTraceback (most recent call last): File "test.py", line 8, in <module> for line in f_in: MemoryError
- shihpeng