首页 > 解决方案 > 您可以将 python 对象重新分配给不同内存地址的对象吗?

问题描述

所以我目前正在尝试使用 OpenMPI Python 库来创建一个并行应用程序来遍历一个图形。在我开始注意到并行进程在通信时不共享同一个对象之前,我并没有走得太远:

import pandas as pd
from collections import defaultdict
from mpi4py import MPI

comm = MPI.COMM_WORLD
rank = comm.Get_rank()

def add_edge(u,v,graph):
    graph[u].append(v)

if rank == 0:

    # A list to represent our graph
    graph = defaultdict(list)    
    # Read in data and build list of edges
    df = pd.read_csv('musae_facebook_edges.csv')
    data = df.head(100)
    for index, row in df.iterrows():
        u = row['id_1'] 
        v = row['id_2']
        add_edge(u,v,graph)
else:
    graph = None

graph = comm.bcast(graph, root = 0)

if rank != 0:
    #graph = comm.recv(source=0, tag=11)
    print("{} has data of id: ".format(rank))
    print(id(graph))
    print(len(graph))

我注意到一个问题,当我尝试将新值写入图形时,它不会传播到其他节点。通过运行上面的代码,mpiexec -np 3 python graphy-search.py我得到以下输出:

1 has data of id: 
139922629199920
18357
2 has data of id: 
139664148236336
18357

显然,每个进程在内存中的某处都有自己的图副本,因为每个图对象的地址对于每个工作节点和根节点都是不同的。同样,当我在搜索期间尝试更新图表时,更改不会反映在其他节点上。

我认为处理这个问题的最简单方法是在我们开始搜索之前简单地将每个进程图的 id 指向驻留在根节点图指定的地址的对象,但我似乎找不到方法来做到这一点。我知道您本质上不使用 python 中的指针,但这是否意味着没有真正的方法来解决这个问题?如果是这样,在并行编程中的应用程序方面,这似乎不是 python 的一个巨大限制吗?

我尝试过使用 MPI 的 bcast、发送/接收等,但这些似乎都没有产生任何不同的结果。我可以看到,我唯一的另一个选择是每次进行更改时都将更改广播回根节点……但是每个进程所需的数据量和 Ops 数量似乎并不可行。

标签: pythonparallel-processingmpi

解决方案


推荐阅读