我在找到一个并行化这个过程很慢的策略时遇到了一些麻烦。我必须解析一些数据并计算列表中所有成对条目之间的分数。由于列表非常大(> 1E6),我必须将所有分数存储在scipy.sparse.csr_matrix((values,(row,col))中,其中值是所有非零分数,行和列的列表是逐行/逐列索引对应于它们各自的2D数组位置。(我使用scipy.parse.csr_matrix,因为numpy 2D数组不适合内存)
主要问题是如何并行化这个过程,在过程结束时调整输入拆分和输出连接之间的行和列索引。
这是我目前的代码。我会很感激任何提示/方向移动一个。
from scipy.sparse import csr_matrix
def heavy_calculation(arg1, arg2):
# some calculations here
return value
def generateCsrMatrix(allArgs):
row = []
col = []
dat = []
for ind1 in range(len(allArgs)-1):
for ind2 in range(ind1+1, len(allArgs):
value = heavy_calculation(allArgs[ind1], allArgs[ind2])
if value > 0:
row.append(ind1)
col.append(ind2)
dat.append(value)
# End nested loop
dat2 = csr_matrix((dat, (row, col), shape=(len(allArgs),len(allArgs)))
return dat2
我的策略是将所有成对索引生成为列表中的元组,并使用多线程生成多线程,但这种方法会增加显着的内存开销。
[(ind1, ind2), (ind1, ind3), ...]