当驾驶循环是传统的" 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()
感谢您考虑这一点。
答案 0 :(得分:0)
multiprocessing
模块创建子进程以执行工作。子进程与其父进程是分开的,父进程看不到子进程中发生的更改。该模块为您提供了几个选项,用于将数据返回到父级(例如,Pool.map
返回值,或通过Manager
代理的数据),但子级的本地本地和全局变量将丢失
在您的情况下,子进程修改了它们的shiftedDataArray
版本,而不是父进程的版本。由于所有这些工作者都在尝试更新同一个对象,因此不太可能存在针对此问题的良好多处理(甚至多线程)解决方案。