当驱动回路为常规“for”时,此代码起作用。当我尝试使用Pool加速时,它失败了。任务是将矩阵中的行移动可变的量。它出现在射电天文学中。数组是uint8的大型集合(40962000000)
作品:
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()
谢谢你考虑这个。你知道吗
multiprocessing
模块创建子流程来完成工作。子进程与其父进程分离,父进程看不到在子进程中所做的更改。该模块为您提供了几个将数据返回到父级的选项(例如,Pool.map
返回值,或通过Manager
代理的数据),但是子级的局部和全局变量会丢失。你知道吗在您的例子中,子进程修改了它们的
shiftedDataArray
版本,而不是父进程的版本。由于所有这些工作人员都在尝试更新同一个对象,因此不太可能有一个好的多处理(甚至多线程)解决方案来解决这个问题。你知道吗相关问题 更多 >
编程相关推荐