我有一个函数,它将图形的节点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 ram和3G交换),所以我想看到那里有为每个进程提供相同的g副本的方法,以便只需要内存来保存它的一个副本?任何建议都表示赞赏,并提前致谢。
答案 0 :(得分:1)
如果将图表划分为较小的部分不起作用,您可以使用this或multiprocessing.sharedctypes找到解决方案,具体取决于图表的对象类型。
答案 1 :(得分:1)
您的评论表明您一次只处理一个节点:
# _myParallelFunction(nodeid) {calculate something for nodeid in g and save it into a file}
我会创建一个生成器函数,每次调用时都会从图形文件中返回一个节点,并将该生成器传递给p.map()
函数而不是整个nodeids
列表。