试图将文件加载到python。这是一个非常大的文件(1.5Gb),但我有可用的内存,我只想做一次(因此使用python,我只需要对文件进行一次排序,所以python是一个简单的选择)。为什么加载这个文件需要这么多的内存?
我的问题是,加载此文件导致方式以内存使用量过多。当我将大约10%的内容加载到内存中时,Python已经在使用700Mb,这显然太多了。大约50%的脚本挂起,使用3.03 Gb的实际内存(并缓慢上升)。
我知道这不是排序文件(记忆方式)最有效的方法,但我只是想让它工作,所以我可以继续解决更重要的问题:D那么,下面的python有什么问题代码是造成了大量的内存使用情况:
print 'Loading file into memory'
input_file = open(input_file_name, 'r')
input_file.readline() # Toss out the header
lines = []
totalLines = 31164015.0
currentLine = 0.0
printEvery100000 = 0
for line in input_file:
currentLine += 1.0
lined = line.split('\t')
printEvery100000 += 1
if printEvery100000 == 100000:
print str(currentLine/totalLines)
printEvery100000 = 0;
lines.append((lined[timestamp_pos].strip(), lined[personID_pos].strip(), lined[x_pos].strip(), lined[y_pos].strip()))
input_file.close()
print 'Done loading file into memory'
编辑:万一有人是不确定,一般的共识似乎是,分配每个变量吃掉越来越多的内存。我在这种情况下通过1)调用readLines(),它仍然加载所有数据,但每行只有一个“字符串”变量开销。这使用大约1.7Gb加载整个文件。然后,当我调用lines.sort()时,我将一个函数传递给在选项卡上分割的键并返回右列值,并将其转换为int。这在计算上是缓慢的,并且总体上需要大量的内存,但它起作用。学习了今天关于变量分配overhad的一吨:D
我想象的,因为名单占用更多的内存空间比其部分的总和。 – 2011-05-20 04:16:31
不够公平,但我们正在谈论〜比我预期消耗的内存多5倍。我不认为他们花了太多的额外! – Hamy 2011-05-20 04:18:45
@哈米耶,它对我来说似乎有点多。 – 2011-05-20 04:20:43