我已经编写了一个程序,可以概括如下:
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系统上。
[beanstalkd](https://github.com/earl/beanstalkc/blob/master/TUTORIAL.mkd)
这样的工具来进行进程集成可能会过度设计,但了解它是否有助于提高性能和扩展性是很有趣的。通常情况下,别人的问题总是更有趣。 - sotapme