使用多处理失败

时间:2016-11-21 02:13:34

标签: python numpy parallel-processing

当驾驶循环是传统的" for"时,此代码有效。当我尝试使用Pool获得加速时,它会失败。任务是将矩阵的行移动可变量。它出现在射电天文学中。这些数组是uint8的大型(4096,2000000)个集合。

使用:

shiftedDataArray = np.zeros((sizeSpectrum,nSpectra), dtype= np.uint8)

dispersionDelayList = np.array([(M31delay(i, centerDM)) for i in
np.arange(sizeSpectrum) ])


@jit
def copyNumba(dispersionDelayList, byFrequencyData, shiftedDataArray,i):
   for j in np.arange(nSpectra):
       if j+dispersionDelayList[i]<nSpectra:
            shiftedDataArray[i][j] = byFrequencyData[i][j+dispersionDelayList[i]]


def shiftRow(i):
    copyNumba(dispersionDelayList, byFrequencyData, shiftedDataArray,i)
    return i


for i in range(sizeSpectrum):
   shiftRow(i)

失败:

shiftedDataArray = np.zeros((sizeSpectrum,nSpectra), dtype= np.uint8)

dispersionDelayList = np.array([(M31delay(i, centerDM)) for i in
np.arange(sizeSpectrum) ])

@jit
def copyNumba(dispersionDelayList, byFrequencyData, shiftedDataArray,i):

    for j in np.arange(nSpectra):
        if j+dispersionDelayList[i]<nSpectra:
            shiftedDataArray[i][j] = byFrequencyData[i][j+dispersionDelayList[i]]

def shiftRow(i):
    copyNumba(dispersionDelayList, byFrequencyData, shiftedDataArray,i)
    return i


pool = Pool(processes=12)

chkByFrequency = pool.map( shiftRow,  range(sizeSpectrum) )

pool.close() 

感谢您考虑这一点。

1 个答案:

答案 0 :(得分:0)

multiprocessing模块创建子进程以执行工作。子进程与其父进程是分开的,父进程看不到子进程中发生的更改。该模块为您提供了几个选项,用于将数据返回到父级(例如,Pool.map返回值,或通过Manager代理的数据),但子级的本地本地和全局变量将丢失

在您的情况下,子进程修改了它们的shiftedDataArray版本,而不是父进程的版本。由于所有这些工作者都在尝试更新同一个对象,因此不太可能存在针对此问题的良好多处理(甚至多线程)解决方案。