python - 如何在python中读取大型压缩文件而不将其全部加载到内存中

标签 python memory readfile readline

我有压缩格式的大型日志文件。例如,largefile.gz,每个文件通常为 4-7gig。

这是代码的相关部分:

for filename in os.listdir(path):
     if not filename.startswith("."):
         with open(b, 'a') as newfile,  gzip.GzipFile(path+filename,'rb') as oldfile:
             # BEGIN Reads each remaining line from the log into a list
             data = oldfile.readlines()  
             for line in data:
                 parts = line.split()

此后,代码将进行一些计算(基本上是总计字节),并将写入一个文件,其中显示“x 标准的总字节数 = y”。所有这些在一个小文件中都可以正常工作。但在大文件上它会杀死系统

我认为我的程序正在做的是读取整个文件,将其存储在数据中,如果我错了请纠正我,但我认为它试图首先将整个日志放入内存中。

问题: 我如何从压缩文件中读取 1 行,对其进行处理,然后继续处理下一行,而不先尝试将整个内容存储在内存中? (或者它真的已经这样做了......我不确定,但根据查看事件监视器,我的猜测是它正在尝试全部进入内存)

谢谢

最佳答案

除非您告诉它,否则它不会将整个内容存储在内存中。也就是说——而不是:

# BAD: stores your whole file's decompressed contents, split into lines, in data
data = oldfile.readlines()  
for line in data:
    parts = line.split()

...使用:

# GOOD: Iterates a line at a time
for line in oldfile:
    parts = line.split()

...所以您没有将整个文件存储在变量中。显然,也不要将 parts 存储在任何超过一行的地方。

就这么简单。

关于python - 如何在python中读取大型压缩文件而不将其全部加载到内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41947907/

相关文章:

angularjs - DOMException : The requested file could not be read, 通常是由于在获取对文件的引用后发生的权限问题

Php readfile - 强制下载

python - 自动计算属性字段的 Django 过滤器查询

c++ - 分配空 std::vector 是否与交换空 std::vector 相同?

c++ - 如何调试由类型特征引起的这个错误?

c - 哪些内存地址可供使用?

loops - 如何在VB脚本中逐行读取文件?

python - multiprocessing.Queue deadlocks after "reader"进程死亡

Python 用循环创建数据帧

python - 如何将文件加载到 python 控制台中?