在Python 2.7中读取大文件会花费太多内存

时间:2011-08-02 06:29:02

标签: python

我使用.readline()逐行解析文件,因为我需要 找出将数据提取到列表中的起始位置,并结束 指向暂停提取,然后重复直到文件结束。 我要读取的文件格式如下:

blabla...
useless....
...
/sign/
data block(e.g. 10 cols x 1000 rows) 
... blank line 
/sign/    
data block(e.g. 10 cols x 1000 rows)
... blank line 
... 
EOF

让我们调用这个文件'myfile' 和我的python片段:

f=open('myfile','r')
blocknum=0 #number the data block
data=[]
while True:
       # find the extract begnning
       while not f.readline().startswith('/sign/'):pass
       # creat multidimensional list to store data block
       data=append([])
       blocknum +=1
       line=f.readline()

       while line.strip():
       # check if the line is a blank line, i.e the end of one block
               data[blocknum-1].append(["2.6E" %float(x) for x in line.split()])
               line = f.readline()
       print "Read Block %d" %blocknum
       if not f.readline(): break

运行结果是读取500M文件消耗了近2GB RAM,我 无法弄明白,有人帮忙! 非常感谢!

1 个答案:

答案 0 :(得分:0)

你的代码中有很多非pythonic模糊的行。我不确定,但认为您可以先按照以下方式修改代码,然后再根据内存使用情况进行检查:

data=[]

with open('myfile','r') as f:
    for line in f:
       # find the extract beginning - think you can add here more parameters to check
       if not line.strip() or line.startswith('/sign/'):
           continue
       data.append(["%2.6E" % float(x) for x in line.strip().split()])

但我认为这段代码也会使用相当多的内存 - 但是如果你真的不需要存储文件中的所有读取数据,你可以修改代码以使用生成器表达式并逐行处理文件数据 - 这会节省你的记忆我猜。