繁体   English   中英

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

[英]Python: share a large dictionary of objects between multiple processes

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

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

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

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

人们无法对字典进行分块,因为用户查询可以是任何类型的。 孩子也需要处理密钥未找到的情况等。

如何在multiprocessingmultiprocessing整个字典中只读模式的子进程?

更新:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM