У меня есть двумерный массив, который создает огромный (> 300 ГБ) список комбинаций, поэтому я хотел бы выполнить ленивую итерацию на итераторе, созданном itertools.combination, и распараллелить эту операцию. Проблема в том, что мне нужно отфильтровать вывод, а это не поддерживается многопроцессорностью. Мой существующий обходной путь для этого требует загрузки списка комбинаций в память, что также не работает из-за размера списка.
n_nodes = np.random.randn(10, 100)
cutoff=0.3
def node_combinations(nodes):
return itertools.combinations(list(range(len(nodes))), 2)
def pfilter(func, candidates):
return np.asarray([c for c, keep in zip(candidates, pool.map(func, candidates)) if keep])
def pearsonr(xy: tuple):
correlation_coefficient = scipy.stats.pearsonr(n_nodes[xy[0]], n_nodes[xy[1]])[0]
if correlation_coefficient >= cutoff:
return True
else:
return False
edgelist = pfilter(pearsonr, node_combinations(n_nodes))
Я ищу способ выполнить ленивую оценку большого итератора, используя многопроцессорную обработку с фильтром вместо отображения.