我已经writen,可以总结如下的程序:的Python多的内存使用情况
def loadHugeData():
#load it
return data
def processHugeData(data, res_queue):
for item in data:
#process it
res_queue.put(result)
res_queue.put("END")
def writeOutput(outFile, res_queue):
with open(outFile, 'w') as f
res=res_queue.get()
while res!='END':
f.write(res)
res=res_queue.get()
res_queue = multiprocessing.Queue()
if __name__ == '__main__':
data=loadHugeData()
p = multiprocessing.Process(target=writeOutput, args=(outFile, res_queue))
p.start()
processHugeData(data, res_queue)
p.join()
真正的代码(尤其是'writeOutput()')是一个复杂得多。 'writeOutput()'只使用这些值作为它的参数(意思是它没有引用对象)
基本上,它将一个巨大的数据集加载到内存中并对其进行处理。写入输出被委托给一个子进程(它实际上写入多个文件,这需要很多时间)。 因此,每次处理一个数据项时,都会将其发送到子进程槽res_queue,然后根据需要将结果写入文件。
子进程不需要以任何方式访问,读取或修改由'loadHugeData()'加载的数据。子流程只需要使用主流程通过'res_queue'发送的内容。这导致我的问题和疑问。
在我看来,子进程得到它的巨大数据集的副本(当检查内存使用'顶')。这是真的?如果是这样,那么我怎么能避免id(本质上使用双内存)?
我正在使用Python 2.6并且程序在linux上运行。
你可以重构你的代码来使用迭代器,而不是加载所有loadHugeData?看起来你可以,如果它看起来像加载/进程/入队/出队/写 – sotapme
“hugeData”不幸是一个制表符分隔的txt文件,基本上包含一个稀疏的数组。我需要在处理过程中根据行号“随机访问”这些数据。因此将其加载到内存中(使用稀疏阵列特定的优化)可以使处理速度更快。 – FableBlaze
这可能是大规模的过度工程,建议使用'[beanstalkd](https://github.com/earl/beanstalkc/blob/master/TUTORIAL.mkd)之类的东西进行流程整合,但知道知道如果它帮助/缩放/执行。像往常一样,其他人的问题总是更有趣。 – sotapme