【发布时间】:2016-05-01 16:38:09
【问题描述】:
我正在尝试并行化我的代码以使用 Python 中的多处理模块查找相似度矩阵。当我使用带有 10 X 15 元素的小型 np.ndarray 时,它工作正常。但是,当我将 np.ndarray 扩展到 3613 X 7040 元素时,系统内存不足。
下面是我的代码。
import multiprocessing
from multiprocessing import Pool
## Importing Jacard_similarity_score
from sklearn.metrics import jaccard_similarity_score
# Function for finding the similarities between two np arrays
def similarityMetric(a,b):
return (jaccard_similarity_score(a,b))
## Below functions are used for Parallelizing the scripts
# auxiliary funciton to make it work
def product_helper1(args):
return (similarityMetric(*args))
def parallel_product1(list_a, list_b):
# spark given number of processes
p = Pool(8)
# set each matching item into a tuple
job_args = getArguments(list_a,list_b)
# map to pool
results = p.map(product_helper1, job_args)
p.close()
p.join()
return (results)
## getArguments function is used to get the combined list
def getArguments(list_a,list_b):
arguments = []
for i in list_a:
for j in list_b:
item = (i,j)
arguments.append(item)
return (arguments)
现在,当我运行以下代码时,系统内存不足并被挂起。我正在传递两个大小为 (3613, 7040) 的 numpy.ndarrays testMatrix1 和 testMatrix2
resultantMatrix = parallel_product1(testMatrix1,testMatrix2)
我不熟悉在 Python 中使用这个模块并试图了解我哪里出错了。任何帮助表示赞赏。
【问题讨论】:
-
getArguments列出了两个矩阵中每对可能的行,所以3613*3613项。在我的机器上,这需要几 GB 的 RAM。尝试改用itertools.product(list_a, list_b)- 这应该会根据需要生成对,而不是一次将它们全部存储在内存中。
标签: python parallel-processing ipython python-multiprocessing