您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python-如何在没有MemoryError的情况下gzip压缩大型文本文件?

Python-如何在没有MemoryError的情况下gzip压缩大型文本文件?

真奇怪 如果您尝试压缩不包含许多换行符的大型二进制文件,则可能会出现此错误,因为这样的文件可能包含对RAM而言太大的“行”,但不应在行上发生- 结构化的.csv文件

但是无论如何,逐行压缩文件并不是很有效。即使OS缓存的磁盘I / O是一般 多少 更快地读取和写入较大的数据块,如64 KB。

在这台机器上有2GB的RAM,并且我刚刚成功使用下面的程序压缩了2.8GB的tar存档。

#! /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()

我正在运行Python 2.6.6,gzip.open()不支持with

正如安德鲁·贝(Andrew Bay)在评论中指出的那样if block == '':,由于block包含字节而非字符串,并且空字节对象不等于空文本字符串,因此在Python 3中无法正常工作。我们 可以 检查代码块的长度,也可以进行比较b''(也可以在Python 2.6+中使用),但是简单的方法if not block:

python 2022/1/1 18:45:31 有338人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶