我有一个程序,它需要一个非常庞大的输入文件并从中输出一个字典。由于这不适合内存,我决定使用shelve将其写入我的磁盘。现在我需要利用我的系统中的多个核心(其中8个),这样我就可以加快解析速度。我认为最明显的方法是将输入文件分成8个部分,同时在所有8个部分上运行代码。问题是我最后只需要一本字典。不是8个。那么如何使用shelve平行更新一个字典呢?
答案 0 :(得分:6)
我在here
上给出了非常详细的答案Processing single file from multiple processes in python不要试图弄清楚如何让多个进程一次写入搁架。想一想如何让一个过程将结果交给货架。
这个想法是你有一个过程产生queue的输入。然后,您可以拥有尽可能多的工作人员来接收排队的项目并完成工作。完成后,他们将结果放入结果队列中以便读取接收器。好处是您不必提前手动拆分工作。只需生成“输入”,让任何工作人员阅读,然后继续工作。
使用此模式,您可以根据系统功能放大或缩小工作人员。
答案 1 :(得分:5)
shelve
doesn't support concurrent access。有几种方法可以实现您的目标:
每个流程制作一个工具架,然后在最后合并。
让工作进程将结果发送回主进程,例如multiprocessing.Pipe
;然后,主人将它们存放在货架上。
我认为你可以让bsddb在类似搁置的API中使用并发访问,但我从来没有必要这样做。