使用多处理导致 MemoryError

Using multiprocessing causes MemoryError

我有一些代码应该获取大量数据(存储在名为 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亿种组合。我的理解是 starmap 应该使用可迭代而不是列表,但我想这个错误可能表明程序正在尝试将组合(或另一个巨大的列表)存储在内存中的某个地方?

好像已经在这里回答了: Python Multiprocessing.Pool lazy iteration

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