Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中读取大型压缩文件而不将其全部加载到内存中_Python_Memory_Readfile_Readline - Fatal编程技术网

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

如何在python中读取大型压缩文件而不将其全部加载到内存中,python,memory,readfile,readline,Python,Memory,Readfile,Readline,我有压缩格式的大型日志文件。ie largefile.gz这些文件通常为4-7千兆位 以下是代码的相关部分: 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 remai

我有压缩格式的大型日志文件。ie largefile.gz这些文件通常为4-7千兆位

以下是代码的相关部分:

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的总字节数。所有这些都可以在一个小文件中正常工作。但在一个大文件上,它会杀死系统

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

问题: 如何从压缩文件中读取一行,处理它,然后转到下一行,而不首先尝试将整个内容存储在内存中?或者它真的已经在这么做了。。我不确定,但根据活动监视器的观察,我猜它正试图全部进入内存


谢谢

在您告诉它之前,它不会将全部内容存储在内存中。也就是说——而不是:

# 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()
…因此您没有将整个文件存储在变量中。显然,也不要将零件存放在超过一条线的任何地方


这很容易。

生成器用于生成值。这么看吧:我认为readlines是Python创建的最糟糕的方法之一,因为它显然是一种错误的方法。人们看到它,并认为它是正确的行内读取方式,但从来没有了解到文件对象天生就是迭代器。大多数情况下,您只想直接迭代文件对象,在极少数情况下,您需要另一种形式的文件,您可以使用listmyfile或其他任何接受iterable并从中创建数据结构的文件,而不需要.readlines。@charles duffy这似乎可行!是否有可能通过将4 Gig或任意数量的文件/%加载到内存中,然后处理掉这些文件来加快速度。它会加快速度还是产生微不足道的影响?@chowpay,因为压缩算法已经在一次处理比一行更大的数据块,我希望它可以忽略不计。