【发布时间】:2018-08-16 21:12:25
【问题描述】:
我正在尝试实现一种高度可并行化的在线递归并行算法。我的问题是我的 python 实现不能按我的意愿工作。我有两个 2D 矩阵,每次在时间步 t 观察到新的观察值时,我想递归地更新每一列。 我的并行代码是这样的
def apply_async(t):
worker = mp.Pool(processes = 4)
for i in range(4):
X[:,i,np.newaxis], b[:,i,np.newaxis] = worker.apply_async(OULtraining, args=(train[t,i], X[:,i,np.newaxis], b[:,i,np.newaxis])).get()
worker.close()
worker.join()
for t in range(p,T):
count = 0
for l in range(p):
for k in range(4):
gn[count]=train[t-l-1,k]
count+=1
G = G*v + gn @ gn.T
Gt = (1/(t-p+1))*G
if __name__ == '__main__':
apply_async(t)
这两个矩阵是 X 和 b。我想直接在主内存上替换,因为每个进程递归地只更新矩阵的一个特定列。
为什么这个实现比顺序的慢?
有没有办法在每个时间步恢复过程而不是杀死它们并重新创建它们?这可能是它变慢的原因吗?
【问题讨论】:
-
worker.apply_async()的任何参数是否可能是大型数据结构? -
大是什么意思? X 和 b 是大型 2D 矩阵,但作为参数,我只传递其中的一列。那我不这么认为
-
好的。我想我找到了您的问题,请参阅下面的答案。您需要根据您的代码和数据结构调整解决方案,但示例应说明问题出在哪里。
-
你能修复缩进吗?那里有几个错误。您能否举例说明您要修改的矩阵?另外,apply_async 已经是 Pool 的一个方法,请检查一下。您的函数递归调用自身并每次生成一个池。这看起来根本不对。
-
我想要实现的是递归的,正如我所说的。从我的最后一个问题很明显,我知道这一点,这就是为什么我问“有没有办法恢复每个时间步的过程,而不是杀死它们并再次创建它们?”。因为我想阻止它递归调用自己。无论如何我可以调用相同的进程来更新矩阵的同一列而不是杀死它并一次又一次地创建它?
标签: python python-3.x parallel-processing multiprocessing