在Python中使用多处理时如何节省内存?

在Python中使用多处理时如何节省内存?,python,multiprocessing,python-multiprocessing,Python,Multiprocessing,Python Multiprocessing,我有一个函数,它将一个图的节点id作为输入,并计算图中的某些内容(不改变图对象),然后将结果保存在文件系统中,我的代码如下所示: ... # graph file is being loaded g = loadGraph(gfile='data/graph.txt') # list of nodeids is being loaded nodeids = loadSeeds(sfile='data/seeds.txt') import multiprocessing as mp # para

我有一个函数,它将一个图的节点id作为输入,并计算图中的某些内容(不改变图对象),然后将结果保存在文件系统中,我的代码如下所示:

...
# graph file is being loaded
g = loadGraph(gfile='data/graph.txt')
# list of nodeids is being loaded
nodeids = loadSeeds(sfile='data/seeds.txt')

import multiprocessing as mp
# parallel part of the code
print ("entering the parallel part ..")
num_workers = mp.cpu_count() # 4 on my machine
p = mp.Pool(num_workers)
# _myParallelFunction(nodeid) {calculate something for nodeid in g and save it into a file}
p.map(_myParallelFunction, nodeids)
p.close()
...

问题是,当我将图形加载到Python中时,它需要大量内存(大约2G,这是一个具有数千个节点的大型图形),但当它开始进入代码的并行部分(并行映射函数执行)时,似乎每个进程都有一个单独的g副本,我的机器上的内存不足(它有6G内存和3G交换),所以我想知道有没有一种方法可以为每个进程提供相同的g副本,这样就只需要存储一个副本的内存?任何建议都将受到欢迎并提前感谢。

如果将图形划分为较小的部分不起作用,您可以使用或找到解决方案,具体取决于您的对象类型图形为。

您的注释表示您一次只处理一个节点:

# _myParallelFunction(nodeid) {calculate something for nodeid in g and save it into a file}

我将创建一个生成器函数,每次调用它时从图形文件返回一个节点,并将该生成器传递给
p.map()
函数,而不是整个
节点列表

我对这方面的了解不足以给你一个确切的答案,但是有一个建议是将图表分成更小的部分,然后使用过程基本上“分而治之”。您可以将图形放入自定义的
多处理.Manager
,这将允许所有进程使用托管在
管理器
进程中的一个共享图形。但是,访问共享图形时会带来很大的性能损失,因此与顺序方法相比,它最终可能无法提高性能。是吗您是否在Windows上运行此功能?如果您在Linux上运行此功能,CoW最好能够启动并防止创建多个
nodeIDs
副本。请参阅此文章和相关文章
multiprocessing.Pool.map
将在处理生成器之前将其转换为列表。您必须使用
multiprocessing.Pool.imap
为了避免这种情况。