Python:在多个进程之间共享一个大型对象字典

标签 python numpy multiprocessing shared-memory

我一直在阅读有关如何在子进程需要只读访问权限的父进程中共享大对象的信息。也许我错过了一些重要的帖子。对于依赖于整个对象的操作,我似乎找不到一个明确的答案(总是分块并分发给工作人员或通过过滤器进行管道传输)。

让我们考虑以下问题。我有大约 300 维的浮点向量,其中一百万个。假设它们被加载到 float32 dtype 的 numpy 数组中。每个向量都与 string 的键相关联。

让我们将这个键值(字符串数组)关系存储在 dict 中。现在我有一个很大的内存中对象。

让我们将我的父进程视为一个服务器进程。它捕获格式为 "key1,key2" 的查询。预计计算并返回 key1 和 key2 之间的成对欧几里德距离。生成子进程以同时处理多个查询。

不能对字典进行分块,因为用户查询可以是任何类型的。 child 还需要处理找不到 key 等情况。

如何在multiprocessing 中处理以只读模式依赖于整个字典的子进程?

更新:

  1. 这个问题中的数字是假设的
  2. dict 可以替换为任何类似哈希表并保持键值关系的对象
  3. 如果我能只读取和反序列化对象一次就好了

最佳答案

你可以使用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/

相关文章:

python - 针对 Python Web 开发的 TDD 资源

python - 遍历代表真实操作的图

python - 列表相同但不被视为相等?

python - 通过 3D 数据数组获取 x、y、z、平均值

python - 在python中并行化for循环

python - Discord Python 机器人 : Changing Status

python - 如何从字节串中恢复二维 numpy.array?

python - 基于忽略缺失值的多个条件的新列

Python Manager通过注册表访问dict

c# - 如何锁定网络上的文件(在 Windows 中)?