首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在python中读取大型压缩文件而不将其全部加载到内存中

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

Stack Overflow用户
提问于 2017-01-31 00:39:45
回答 1查看 1.6K关注 0票数 1

我有压缩格式的大型日志文件。ie,largefile.gz,这些通常是4-7个,每个.

下面是代码的相关部分:

代码语言:javascript
运行
复制
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的总字节”。所有这些都可以在一个小文件中很好地工作。但是在一个大文件中,它杀死了系统。

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

问:我如何从压缩文件中读取1行文件,然后处理它,然后转移到下一行,而不首先将整个文件存储在内存中?(或者它真的已经这么做了..。我不确定,但根据查看活动监视器的结果,我猜它是在尝试记忆)

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-31 00:43:00

直到你告诉它,它才把所有的内容存储在内存中。也就是说--而不是:

代码语言:javascript
运行
复制
# BAD: stores your whole file's decompressed contents, split into lines, in data
data = oldfile.readlines()  
for line in data:
    parts = line.split()

...use:

代码语言:javascript
运行
复制
# GOOD: Iterates a line at a time
for line in oldfile:
    parts = line.split()

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

就这么简单。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41947907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档