如何读取 python 中的大型压缩文件而不将其全部加载到内存中
how to read a large compressed file in python without loading it all in memory
我有压缩格式的大型日志文件。即 largefile.gz 这些通常是每个 4-7gigs。
这是代码的相关部分:
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()
在此之后,代码将进行一些计算(基本上是对字节进行总计),并将写入一个显示 "total bytes for x critera = y" 的文件。所有这些在一个小文件中都可以正常工作。但是在大文件上它会杀死系统
我认为我的程序正在读取整个文件,并将其存储在 data 如果我错了请纠正我,但我认为它试图将整个日志放入记忆优先。
问题:
我如何从压缩文件中读取 1 行,处理它然后继续下一个而不是先尝试将整个内容存储在内存中? (或者它是否真的已经这样做了……我不确定,但根据 activity 监视器的观察,我的猜测是它正试图将所有内容都存储在内存中)
谢谢
除非您告诉它,否则它不会存储全部内容 in-memory。也就是说——而不是:
# 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
存储在超过一行的任何地方。
很简单。
我有压缩格式的大型日志文件。即 largefile.gz 这些通常是每个 4-7gigs。
这是代码的相关部分:
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()
在此之后,代码将进行一些计算(基本上是对字节进行总计),并将写入一个显示 "total bytes for x critera = y" 的文件。所有这些在一个小文件中都可以正常工作。但是在大文件上它会杀死系统
我认为我的程序正在读取整个文件,并将其存储在 data 如果我错了请纠正我,但我认为它试图将整个日志放入记忆优先。
问题: 我如何从压缩文件中读取 1 行,处理它然后继续下一个而不是先尝试将整个内容存储在内存中? (或者它是否真的已经这样做了……我不确定,但根据 activity 监视器的观察,我的猜测是它正试图将所有内容都存储在内存中)
谢谢
除非您告诉它,否则它不会存储全部内容 in-memory。也就是说——而不是:
# 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
存储在超过一行的任何地方。
很简单。