我分配了一个multiprocessing.sharedctypes.Array,以便在进程间共享。包装此程序是一个生成器,它生成从该数组计算的结果。在将数组用于任何并行计算之前,我在2次迭代后遇到Segmentation fault
错误,我怀疑是由于C和Python之间的释放机制造成的。我可以使用以下简单的代码片段重现错误:
import numpy as np
from multiprocessing import Pool, sharedctypes
def generator(niter):
while niter > 0:
tmp = np.ctypeslib.as_ctypes(np.random.randn(300, 100000))
shared_arr = sharedctypes.Array(tmp._type_, tmp, lock=False)
table = np.ctypeslib.as_array(shared_arr)
yield np.sum(table)
niter -=1
for s in generator(10):
print s
如果我减小阵列的大小,即3x10而不是300x100000,则不会发生分段错误。这不是内存不足,因为我的PC有16GB,当时只使用6GB。 300x100,000阵列只需几百MB。