尝试将文件加载到Python中。这是一个非常大的文件(1.5Gb),但我有可用的内存,我只想执行一次(因此使用Python,我只需要对文件进行一次排序,所以Python是一个简单的选择)。
我的问题是加载此文件会导致内存使用过多。当我将大约10%的行加载到内存中时,Python已经使用了700Mb,这显然太多了。在大约50%时,脚本挂起,使用3.03 Gb的实际内存(并且慢慢上升)。
我知道这不是最有效的文件排序方法(就内存而言),但我只想让它工作,这样我就可以转向更重要的问题:D。那么,以下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()时,我传递一个函数到key上,该函数在制表符处拆分并返回正确的列值,转换为int类型。这在计算上很慢,总体上占用了大量内存,但它确实有效。今天我学到了很多关于变量分配开销的知识:D