13

3 つの異なる numpy 2D 配列で大規模な計算を順番に実行しています。配列は巨大で、それぞれ 25000x25000 です。各計算にはかなりの時間がかかるため、サーバーの 3 つの CPU コアで 3 つの計算を並行して実行することにしました。標準のマルチプロセッシング ガイドラインに従って、2 つのプロセスとワーカー関数を作成しています。2 つの計算は 2 つのプロセスを介して実行され、3 つ目の計算は個別のプロセスなしでローカルで実行されます。次のようなプロセスの引数として巨大な配列を渡しています。

p1 = Process(target = Worker, args = (queue1, array1, ...)) # Some other params also going

p2 = Process(target = Worker, args = (queue2, array2, ...)) # Some other params also going

ワーカー関数は、次のようにキューに追加されたリストで 2 つの numpy ベクトル (1D 配列) を返します。

queue.put([v1, v2])

私は使用していませんmultiprocessing.pool

しかし驚くべきことに、スピードアップは得られず、実際には 3 倍の速度で実行されています。大きな配列を渡すのに時間がかかりますか? 何が起こっているのか理解できません。配列を渡す代わりに共有メモリ オブジェクトを使用する必要がありますか?

誰かが助けてくれれば感謝します。

ありがとうございました。

4

2 に答える 2

1

np.memmapと を使用した例を次に示しPoolます。プロセスとワーカーの数を定義できることを確認してください。この場合、次を使用して達成できるキューを制御できませんmultiprocessing.Queue

from multiprocessing import Pool

import numpy as np

def mysum(array_file_name, col1, col2, shape):
    a = np.memmap(array_file_name, shape=shape, mode='r+')
    a[:, col1:col2] = np.random.random((shape[0], col2-col1))
    ans = a[:, col1:col2].sum()
    del a
    return ans

if __name__ == '__main__':
    nop = 1000 # number_of_processes
    now = 3 # number of workers
    p = Pool(now)
    array_file_name = 'test.array'
    shape = (250000, 250000)
    a = np.memmap(array_file_name, shape=shape, mode='w+')
    del a
    cols = [[shape[1]*i/nop, shape[1]*(i+1)/nop] for i in range(nop)]
    results = []
    for c1, c2 in cols:
        r = p.apply_async(mysum, args=(array_file_name, c1, c2, shape))
        results.append(r)
    p.close()
    p.join()

    final_result = sum([r.get() for r in results])
    print final_result

可能であれば、共有メモリの並列処理を使用してパフォーマンスを向上させることができます。この関連する質問を参照してください。

于 2013-10-31T23:09:00.213 に答える