在Python多处理环境中,我需要一个高效的共享字典

在Python多处理环境中,我需要一个高效的共享字典,python,dictionary,multiprocessing,shared-memory,Python,Dictionary,Multiprocessing,Shared Memory,我已经使用Python的多处理包实现了一个生产者多消费者模式。消费者应该把结果放在字典里。该字典的键是单词,值是大的Scipy稀疏矩阵。每个消费者将其看到的每个单词的值添加到共享词典中该单词的主向量中 我使用Manager.dict()实现了这个共享字典,但速度非常慢。每个进程的cpu利用率约为15%,比单个进程稍微好一点。 每个使用者从共享字典中获取一个项目,向该项目的值添加一个稀疏矩阵,并更新共享字典中的项目 有没有更有效的解决方案 import memcache memc = memca

我已经使用Python的多处理包实现了一个生产者多消费者模式。消费者应该把结果放在字典里。该字典的键是单词,值是大的Scipy稀疏矩阵。每个消费者将其看到的每个单词的值添加到共享词典中该单词的主向量中

我使用Manager.dict()实现了这个共享字典,但速度非常慢。每个进程的cpu利用率约为15%,比单个进程稍微好一点。 每个使用者从共享字典中获取一个项目,向该项目的值添加一个稀疏矩阵,并更新共享字典中的项目

有没有更有效的解决方案

import memcache

memc = memcache.Client(['127.0.0.1:11211'], debug=1);
memc.set('top10candytypes', {1 : 2, "3" : [4,5,6]})

bestCandy = memc.get('top10candytypes')
print(bestCandy)

我不是memcache方面的专家,因为我自己刚刚开始使用它。但是,如果您有多个线程需要访问相同的数据,或者您只需要在不耗尽ram的情况下高效地存储数据,那么它非常方便。

memcache
-我想通过对字符串使用另一种编码(UTF-8?)来克服unicode问题应该不会太难。对于这个用例,我怀疑memcache是否会比python多处理管理器更快。有人有基准吗?我很好奇,因为我也做过类似的事情,我发现唯一的快速解决方案是使用多处理阵列的共享内存,但这感觉相当混乱。是的,做
yourstring.decode('utf-8')
应该就够了,虽然我真的不明白为什么这会是一个问题,因为Python所做的是使用cPickle以其原始对象形式存储变量,因此您可以从理论上memcache类对象,并返回它在存储之前的状态。或者您可以在存储数据之前对数据进行JSON加密或更改此整洁的代码段以进行unicode转换:memcache是除内存中的原始变量外速度最快的存储系统。@Torxed我认为您的字典解决方案很好,但只适用于线程而不适用于进程(除非您使用管理器)。我经常使用的另一种多处理模式是让主线程通过一个队列分配工作,并从另一个队列收集结果,这样字典只能在主线程中组装。当您开始传递大量数据时,速度会很慢,但如果是这样,那么您的内容可能会受到缓存和CPU周期的限制。在这些情况下,正如您所说,优化可能需要在较低的级别上进行,例如使用Cython/openMP@user956730听起来就像是MapReduce设计的那种任务@user956730意识到这有点晚了,但我今天刚刚遇到joblib,并认为它提供了一些有趣的建议来解决我们正在讨论的问题,特别是编写带有no_gil标志的Cython函数,以及在磁盘上映射大型阵列以在进程之间共享: