我想与concurrent.futures
一起使用numpy
来操纵两个scipy.sparse
矩阵:
matrix_A = scipy.sparse.lil_matrix((1000, 1000), dtype=np.float32)
matrix_B = scipy.sparse.lil_matrix((500, 1000), dtype=np.float32)
算法的工作原理如下:matrix_B
中的每一行与matrix_A
中的行都有一对多的关系。对于row_B
中的每个matrix_B
,我会在[row_A1, row_A2 ... row_An ]
中找到相应的matrix_A
,将它们相加并将总和分配给row_B
。
def update_values(row):
indices, values = find_rows_in_matrix_A(row)
matrix_B[row, indices] = values
矩阵很大(10 ^ 7行),我想并行运行这个操作:
with concurrent.futures.ProcessPoolExecutor(max_workers=32) as executor:
futures = {row : executor.submit(update_values, row)
for row in range(matrix_B.shape[0])}
但这不起作用,因为子进程对全局变量所做的更改对于父进程是不可见的(如this answer中所述)。
另一种选择是从update_values
返回值,但这需要合并父进程中的值,这对我的用例来说需要太长时间。
使用multiprocessing.Manager.Array
可能是一种解决方案,但是这会在每次写入时创建矩阵的副本,并且考虑到它们的大小,这不是一种选择。
有没有办法让matrix_B
可以从子进程写入?或者什么是更好的解决这个问题的方法?