私は256x256x256
ヌンピー配列を持っています、各要素は行列です。私はこれらの行列のそれぞれについていくつかの計算をする必要があります。そして、私はmultiprocessing
モジュールを使って処理を高速化したいと考えています。元の配列の要素[i,j,k]
におけるマトリックスの結果は、新しい配列の[i,j,k]
要素に入れなければならないように、これらの計算のitertoolsとマルチプロセッシングを組み合わせる?
結果は、元のよう256x256x256
配列に格納されなければなりません。
これを行うには、擬似的に書かれたリストを[array[i,j,k], (i, j, k)]
として「マルチプロセッシング」する関数に渡したいと思います。 matrices
は、元の配列とmyfunc
から抽出された全ての行列のリストで計算を行う機能である、コードは多少のようになりますと仮定すると:map_async
は実際にこれを作成しているよう
import multiprocessing
import numpy as np
from itertools import izip
def myfunc(finput):
# Do some calculations...
...
# ... and return the result and the index:
return (result, finput[1])
# Make indices:
inds = np.rollaxis(np.indices((256, 256, 256)), 0, 4).reshape(-1, 3)
# Make function input from the matrices and the indices:
finput = izip(matrices, inds)
pool = multiprocessing.Pool()
async_results = np.asarray(pool.map_async(myfunc, finput).get(999999))
しかし、それはそう巨大なfinput
- リスト1:私のCPUはあまり進んでいませんが、メモリとスワップは数秒で完全に消費されます。これは明らかに私が望むものではありません。
明示的に最初に作成する必要なしに、この巨大なリストをマルチプロセッシング機能に渡す方法はありますか? または、この問題を解決する別の方法をご存知ですか?
ありがとうございました! :-)
'map_async()'で 'get()'を使っているので、おそらく*非同期*操作は不要で、代わりに 'Pool.map()'を使うべきです。 –
おそらく私は問題を正しく理解していないかもしれませんが、あなたはimapまたはimap_unorderedを考慮しましたか? –