我有一个计算量很大的项目,似乎是并行化的良好候选者。该代码使用大量的GIS轮廓,并占用大约1.5 GB的内存作为单个进程。可以并行化的逻辑有两个级别:将项目区域拆分为较小(但仍然相当大)的区域的外层,以及使用相当短的区域进行大量数学运算的内层循环。
由于pickle,尝试在外部循环上使用concurrent.futures失败。 Pathos运行并创建了多个进程,但使用了大量内存,实际上速度较慢。我假设减速是由于莳萝序列化和重新创建非常大的对象。
我还没有尝试将内环并行化,但应该能够将代码和轮廓分解为相对较小的对象(~10 KB),而不是计算外部模块(形状)。虽然python有很多并行处理选项,但我没有找到关于处理对象和管理内存的最佳方法的良好讨论。什么是一个好的包/方法,可以从一个更大的进程中有效地将一个小对象拆分成一个新进程?
我认为最好使用两个级别的并行化,但我不确定并需要进行一些分析。外环可以稍微提高内存效率,但将它分成多个进程可能不太现实。内部循环应该很容易分解成小型,内存有效的部分,我只是不确定最好的包使用。
编辑:绝大多数处理都在shapley包中,这是GEOS的python前端,在C中(我认为)。我目前正在使用python 2.7,但如果它有用,我愿意切换到3。