【问题标题】:Using multiprocessing causes MemoryError使用多处理会导致 MemoryError
【发布时间】:2021-11-02 13:46:04
【问题描述】:

我有一些代码应该获取大量数据(存储在名为stabiliser_states 的变量中)并对大小为set_size 的每个子集进行一些分析。由于子集的数量可能会变得非常大,因此我一直在尝试使用多处理模块来并行化代码。但是,对于我真正感兴趣的数据,运行代码最终会导致 MemoryError。

这是已并行化的部分代码。函数check_lin_dep 进行数据分析,似乎工作正常。

import multiprocessing as mp
from itertools import combinations

...

pool = mp.Pool()
lin_dep_iter = pool.starmap(
    check_lin_dep,
    ((comb[1], n, set_size, comb[0]) for comb in \
         enumerate(combinations(stabiliser_states, set_size))),
    chunksize=1000
)
pool.close()

对于导致 MemoryError 的数据,stabiliser_states 的长度约为 37000,因此对于 set_size = 2,大约有 7 亿个组合。我的理解是星图应该使用可迭代而不是列表,但我认为该错误可能表明程序正在尝试将组合(或另一个巨大的列表)存储在内存中的某个地方?

【问题讨论】:

    标签: python multiprocessing python-multiprocessing


    【解决方案1】:

    这里似乎已经回答了: Python Multiprocessing.Pool lazy iteration

    【讨论】:

    • 是的,我正要自己发布这个。那行代码是一个元组推导式,所以它在任何工作完成之前创建了一个巨大的元组。
    • 所以我仔细检查了,我相信 确实 行创建了一个生成器而不是一个元组,尽管我已经改变了它,因为它有点难以读。在做了更多的研究之后,似乎真正的问题是星图将生成器转换为幕后的列表(stackoverflow.com/questions/44708312/…)......有没有我可以使用的不同功能不会这样做?
    • 不要从我的头顶上。但我发现有人解决了类似的问题:newbedev.com/python-multiprocessing-pool-lazy-iteration 或在 stackoverflow 中:stackoverflow.com/questions/5318936/…
    【解决方案2】:

    出于我的目的,我发现真正的问题是 starmap 将 args 生成器转换为幕后的列表 (How to use a generator as an iterable with Multiprocessing map function)。这就是导致 MemoryError 的原因。我可以通过简单地使用 imap 而不是 starmap 来解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2022-01-13
      • 2018-10-26
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多