我需要在Python多处理环境中使用高效的共享字典

Ash*_*Ash 6 python dictionary shared-memory multiprocessing

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

我使用Manager.dict()来实现这个共享字典,但速度非常慢.每个进程的cpu-utilization约为15%,它比单个进程好一点.每个使用者从共享字典中提取项目,将稀疏矩阵添加到该项目的值并更新共享字典中的项目.

有没有更有效的解决方案?

Tor*_*xed 3

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)
Run Code Online (Sandbox Code Playgroud)

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

  • @Torxed我认为你的字典解决方案很好,但只适用于线程而不是进程(除非你使用管理器)。我经常使用的另一种多处理模式是让主线程通过一个队列分配工作并从另一个队列收集结果,以便字典仅在主线程中组装。当您开始传递大量数据时,速度会很慢,但如果是这种情况,那么您的数据可能会像 CPU 周期一样受到缓存的限制。在这些情况下,正如您所说,优化可能需要在较低级别进行,例如使用 Cython / openMP (2认同)
  • @user956730 听起来正是 MapReduce 设计的任务类型! (2认同)
  • @user956730意识到这有点晚了,但我今天刚刚遇到 joblib 并认为它提供了一些有趣的建议来解决我们正在讨论的问题 - 特别是使用 no_gil 标志编写 Cython 函数并映射磁盘上的大型数组以在进程之间共享:https ://pythonhosted.org/joblib/parallel.html (2认同)