【问题标题】:updating a shelve dictionary in python parallely并行更新python中的搁置字典
【发布时间】:2012-07-14 16:25:30
【问题描述】:

我有一个程序,它需要一个非常大的输入文件并从中生成一个 dict。由于无法将其放入内存中,因此我决定使用搁置将其写入磁盘。现在我需要利用系统中可用的多个内核(其中 8 个),以便加快解析速度。我认为最明显的方法是将我的输入文件分成 8 个部分并同时在所有 8 个部分上运行代码。问题是我最后只需要一本字典。不是8个。那么如何使用 shelve 并行更新一个字典呢?

【问题讨论】:

    标签: python parallel-processing multiprocessing shelve


    【解决方案1】:

    shelvedoesn't support concurrent access。有几个选项可以实现您想要的:

    1. 每个进程制作一个架子,然后在最后合并。

    2. 让工作进程通过例​​如multiprocessing.Pipe 将其结果发送回主进程;然后主人将它们存放在架子上。

    3. 我认为您可以让bsddb 在类似搁置的 API 中使用并发访问,但我从来没有需要这样做。

    【讨论】:

    • 我推荐选项 2。很容易忘记并发写入搁置并让单个写入器从队列中接受。所有工作人员解析并添加到队列中。 “生产者-工人-汇”
    【解决方案2】:

    我在Processing single file from multiple processes in python上给了here一个相当详细的答案

    不要试图弄清楚如何让多个进程同时写入搁置。考虑一下如何让一个流程将结果搁置。

    这个想法是你有一个单一的进程产生输入到queue。然后,您有尽可能多的工作人员来接收排队的项目并完成工作。完成后,它们将结果放入结果队列中,以供接收器读取。好处是您不必提前手动拆分工作。只需产生“输入”,让读取的任何工作人员接受并处理它。

    使用此模式,您可以根据系统功能扩大或缩小工作人员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 2020-07-03
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多