【发布时间】:2021-01-28 17:54:24
【问题描述】:
我有一个问题,我的想法已经不多了,所以我希望有人有更好的想法。
我正在尝试在 python 中对数百万个数据点进行优化。我有一个函数calculate(data),它接收一个巨大的数组data,并返回一个大小相同的数组results。计算相当简单,但需要使用data 中的多个条目对results 中的每个条目进行计算,不幸的是无法矢量化。由于维度原因,data 和 results 的大小很大,无法缩小。
由于计算的数量庞大,这可能需要几天的时间来计算。
因此我开始使用multiprocessing,它显着提高了速度。我实现这一点的方法是将results 切割成块,为每个核心提供完整的(必需的)data 数组以及计算整个results 数组的单个块并返回它们以在之后合并它们的任务。 (使用pool.apply_async(func, (data,)))
随着data 的大小进一步增加,我开始出现内存错误。根据我的分析,这是因为每个核心都有其单独的 data 数组,这意味着我的 RAM 中有 data 的原始 1 + # of cores 副本。为了减少这一点,我想我会尝试使用带有代理字典的管理器来处理data,然后每个核心都可以访问它。 (使用data_shared = manager.dict(data))不幸的是,这非常慢,这大概就是不推荐它的原因。
我错过了一个明显的解决方案吗?我非常感谢任何想法。
【问题讨论】:
标签: python memory multiprocessing