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

时间:2017-01-31 00:39:45

标签: 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 critera = y"的总字节数。所有这些在一个小文件中工作正常。但是在一个大文件上它会杀死系统

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

问题: 我如何从压缩文件中读取1行,处理它然后继续前进到下一行,而不是先尝试将整个内容存储在内存中? (或者它真的已经这样做了......我不确定,但基于查看活动监视器,我的猜测是它试图全力以赴)

由于

1 个答案:

答案 0 :(得分: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存储在任何一条线路上的任何地方。

那很容易。