python - 您可以将 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 数量似乎并不可行。
解决方案
推荐阅读
- javascript - 当var作为参数传递时,javascript函数不起作用
- firebase - 我可以请求发送到设备的所有推送通知都显示在屏幕上吗?
- c# - 如何在加载 Window 之前使用 Dispatcher.PushFrame?
- python - 请求库中的 selenium driver.page_source 等效项
- objective-c - Swift 在从 Objective-C 子类化的类中覆盖 init()
- c# - 如何在 azure 函数中验证 jwt 令牌
- r - R中write.csv函数的输出文件的奇怪问题。在按预期工作之前需要打开和关闭csv输出文件
- sftp - WinSCP 系统找不到指定的路径
- javascript - Target Sum 没有输出正确的值
- firebase - 将 SearchField 添加到 StreamBuilder 从 Firestore 读取