使用多处理导致 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 来解决这个问题。
我有一些代码应该获取大量数据(存储在名为 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 来解决这个问题。