我一直在阅读有关如何在子进程需要只读
访问权限的父进程中共享大对象的信息。也许我错过了一些重要的帖子。对于依赖于整个对象的操作,我似乎找不到一个明确的答案(总是分块并分发给工作人员或通过过滤器进行管道传输)。
让我们考虑以下问题。我有大约 300 维的浮点向量,其中一百万个。假设它们被加载到 float32
dtype 的 numpy
数组中。每个向量都与 string
的键相关联。
让我们将这个键值(字符串数组)关系存储在 dict
中。现在我有一个很大的内存中对象。
让我们将我的父进程视为一个服务器
进程。它捕获格式为 "key1,key2"
的查询。预计计算并返回 key1 和 key2 之间的成对欧几里德距离。生成子进程以同时处理多个查询。
不能对字典进行分块,因为用户查询可以是任何类型的。 child 还需要处理找不到 key 等情况。
如何在multiprocessing
中处理以只读模式依赖于整个字典的子进程?
更新:
- 这个问题中的数字是假设的
dict
可以替换为任何类似哈希表并保持键值关系的对象- 如果我能只读取和反序列化对象一次就好了
最佳答案
你可以使用Manager中的dict(),如下代码:
from multiprocessing import Process, Manager
def f(d, l):
d[1] = '1'
d['2'] = 2
d[0.25] = None
l.reverse()
if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()
l = manager.list(range(10))
p = Process(target=f, args=(d, l))
p.start()
p.join()
print(d)
print(l)
它打印:
{0.25:无,1:'1','2':2}
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
dict()
可在多个进程之间共享。
关于Python:在多个进程之间共享一个大型对象字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33859617/