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

时间:2015-11-22 20:11:58

标签: python numpy multiprocessing shared-memory

我一直在阅读有关如何在父流程中共享子进程需要read-only访问权限的大对象的内容。也许我错过了一些重要的帖子。我似乎没有为依赖于整个对象的操作找到一个干净的答案(总是分块并分发给工人或通过过滤器管道)。

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

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

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

无法对字典进行分块,因为用户查询可以是任何类型。孩子也需要处理key-not-found等的情况。

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

更新

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

1 个答案:

答案 0 :(得分:0)

您可以使用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: None, 1: '1', '2': 2} [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

dict()可在多个进程之间共享。