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

shihpeng

我使用以下简单的Python脚本在EC2 m3.large实例上压缩大型文本文件(例如10GB)。但是,我总是得到MemoryError

import gzip

with open('test_large.csv', 'rb') as f_in:
    with gzip.open('test_out.csv.gz', 'wb') as f_out:
        f_out.writelines(f_in)
        # or the following:
        # for line in f_in:
        #     f_out.write(line)

我得到的追溯是:

Traceback (most recent call last):
  File "test.py", line 8, in <module>
    f_out.writelines(f_in)
MemoryError

我已经阅读了有关此问题的一些讨论,但仍不清楚如何处理。有人可以给我一个关于如何处理此问题的更容易理解的答案吗?

2号环

真奇怪 如果您尝试压缩不包含许多换行符的大型二进制文件,则可能会出现此错误,因为这样的文件可能包含对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:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我如何在python中没有\ n的情况下打印文本文件

如何在python中没有分隔符的情况下解析文本文件

如何在不写入磁盘的情况下使用Python请求上传文本文件

在没有正则表达式的情况下检查整个单词是否在python的文本文件中

如何在不使用python更改格式的情况下合并文本文件中存在的数据?

如何在不按行拆分的情况下将大量长文本文件下载到 Python 中?

有没有一种简单的方法可以在不使用CSV的情况下使用Python将文本文件转换为字典?

在没有用户输入的情况下替换/删除打开的文本文件中的子字符串(Python 3)

如何在不使用 glob (python3.4) 的情况下将递归文件列表输出到文本文件

如何在python中编写没有任何分隔符的文本文件?

Python tarfile:如何在遵循符号链接的情况下使用tar + gzip压缩?

如何在不使用 git 的情况下为 Python 中的文本文件管理类似 git 的版本控制?

如何在没有外部模块的情况下清理 Python 3 文本块?

如何在Python中的大型文本文件中查找短语?

如何在没有 Python 的情况下读取 .py

如何在没有pyinstaller的情况下使用“ ./”创建python可执行文件

python pandas如何在没有未命名列的情况下读取excel文件

如何在没有索引的情况下将 Python 字典保存到 csv 文件?

如何在没有路径的情况下运行python文件?

如何在没有提示的情况下使用Python静默运行批处理文件?

如何在 Python 中没有任何循环(如:for、while 等)的情况下递归 JSON 文件

如何在Python中压缩已处理的文本文件?

我如何在没有写入所有目录的情况下在 python 中压缩文件

Python IO-在其他程序正在写入python的情况下读取文本文件是否安全?

Python:如何比较两个文本文件中的字符串并在匹配的情况下检索一行的附加行

在没有脚本文件的情况下从命令行执行python程序

如何在不使用range()python的情况下删除文本文档的特定部分

如何在不需要bash脚本文件的情况下转换python文件?

我如何成功捕获所有可能的情况以从文本文件创建python列表