Pythonでマルチプロセッシングモジュールを使用して類似性行列を見つけるためにコードを並列化しようとしています。小さなnp.ndarrayを10 X 15要素で使用するとうまく動作します。しかし、私がnp.ndarrayを3613 X 7040の要素にスケールすると、システムのメモリが不足します。Pythonマルチプロセッシングプールが使用されているときにシステムのメモリが不足していますか?
以下は私のコードです。
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)
次のコードを実行すると、システムのメモリが不足してハングアップします。私はPythonで、このモジュールを使用して、私が間違っているつもりかを理解しようとしているに新しいですサイズで2 numpy.ndarrays testMatrix1とtestMatrix2(3613、7040)
resultantMatrix = parallel_product1(testMatrix1,testMatrix2)
を渡しています。どんな助けもありがとうございます。
'getArguments'は、2つの行列の可能なすべての行のリストを作成します。つまり、' 3613 * 3613'の項目です。私のマシンでは、数GBのRAMが必要です。 'itertools.product(list_a、list_b)'を代わりに使うようにしてください。これは必要に応じてペアを生成し、一度にすべてをメモリに格納する必要はありません。 –