Parallel processing 避免Ipython并行中的cPickle

Parallel processing 避免Ipython并行中的cPickle,parallel-processing,ipython,pickle,Parallel Processing,Ipython,Pickle,我有一些代码,我已经成功地并行了,从某种意义上说,它得到了一个答案,但它仍然有点慢。使用cProfile.run,我发现总时间的121秒57%都花在了cPickle.dumps上,尽管每次调用的时间为.003。我没有在其他任何地方使用这个函数,所以它一定是由于ipython的并行性而发生的 我的代码的工作方式是,它做一些串行的事情,然后并行运行许多模拟。然后是一些串行的东西,然后是并行的模拟。它必须重复很多次。每个模拟都需要一个非常大的字典,我从自己编写的模块中提取它。我相信这正是很多次被腌制的

我有一些代码,我已经成功地并行了,从某种意义上说,它得到了一个答案,但它仍然有点慢。使用cProfile.run,我发现总时间的121秒57%都花在了cPickle.dumps上,尽管每次调用的时间为.003。我没有在其他任何地方使用这个函数,所以它一定是由于ipython的并行性而发生的

我的代码的工作方式是,它做一些串行的事情,然后并行运行许多模拟。然后是一些串行的东西,然后是并行的模拟。它必须重复很多次。每个模拟都需要一个非常大的字典,我从自己编写的模块中提取它。我相信这正是很多次被腌制的东西,并且减慢了程序的速度


有没有办法把一本大字典推到引擎上,让它永远留在那里?我认为每次调用并行函数时,它都会被物理推送。

如果每次调用函数时不需要整个字典,那么应该单独存储键值对,这样您只需加载/转储所需内容,请参阅klepot了解如何执行此操作。另外,如果您想避免使用cPickle,可以使用dill或cloudpickle作为ipython.parallel中的替代序列化程序。我基本上不可能知道我需要字典的哪些部分。这取决于模拟产生的是随机的。这也可能是整个函数序列化的一个问题。很难说我只知道泡菜。垃圾场经常接到电话。我会试着使用dill,看看是否有性能提升。就在几分钟前偶然发现了这个功能。你不需要提前知道你需要什么键值对,这是一种更好的存储/检索条目的方法。例如,如果值是数组数据,则memmapped文件的集合可以工作,或者值是浮点值,则pickle可以很好地工作。如果dict很大,但条目并不是所有需要的,那么解决方案应该是存储条目,以便您可以在再次需要时查找所需内容,请参阅klepto,它为磁盘或数据库上的表格数据提供dict接口。如果不知道您的数据是什么样子,很难说得更多。