使用多处理失败

2024-09-29 19:27:33 发布

您现在位置:Python中文网/ 问答频道 /正文

当驱动回路为常规“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() 

谢谢你考虑这个。你知道吗


Tags: infordefnppooluint8arangenspectra
1条回答
网友
1楼 · 发布于 2024-09-29 19:27:33

multiprocessing模块创建子流程来完成工作。子进程与其父进程分离,父进程看不到在子进程中所做的更改。该模块为您提供了几个将数据返回到父级的选项(例如,Pool.map返回值,或通过Manager代理的数据),但是子级的局部和全局变量会丢失。你知道吗

在您的例子中,子进程修改了它们的shiftedDataArray版本,而不是父进程的版本。由于所有这些工作人员都在尝试更新同一个对象,因此不太可能有一个好的多处理(甚至多线程)解决方案来解决这个问题。你知道吗

相关问题 更多 >

    热门问题