【发布时间】:2013-01-22 21:08:03
【问题描述】:
我写了一个程序,可以总结如下:
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() 仅使用它作为参数的这些值(意味着它不引用 data)
基本上,它将一个巨大的数据集加载到内存中并对其进行处理。输出的写入被委托给一个子进程(它实际上写入多个文件,这需要很多时间)。 因此,每次处理一个数据项时,它都会通过 res_queue 发送到子进程,然后再根据需要将结果写入文件。
子进程不需要以任何方式访问、读取或修改loadHugeData()加载的数据。子进程只需要使用主进程通过res_queue发送的内容。这引出了我的问题和疑问。
在我看来,子进程拥有自己的庞大数据集副本(使用top 检查内存使用情况时)。这是真的?如果是这样,那么我怎样才能避免 id (本质上使用双内存)?
我使用的是 Python 2.6,程序在 linux 上运行。
【问题讨论】:
-
你能重组你的代码以使用迭代器而不是加载所有的 loadHugeData 吗?如果它看起来像加载/处理/入队/出队/写入,您似乎可以这样做
-
不幸的是,“hugeData”是一个制表符分隔的 txt 文件,基本上包含一个稀疏数组。我需要在处理过程中根据行号“随机访问”这些数据。因此将其加载到内存中(使用稀疏数组特定的优化)会使处理速度更快。
-
建议使用 `beanstalkd 之类的东西来进行流程集成可能会过度设计,但如果知道它是否有帮助/扩展/执行会很有趣。像往常一样,别人的问题总是更有趣。
标签: python linux memory-management multiprocessing