2017-09-08 11 views
1

Pythonでマルチプロセッシングされた関数から出力を抽出する方法を知りたいと思います。私はマルチプロセッシングを初めて学び、それがどのように機能するかについては限られた理解しか持たない。マルチプロセッシングされたPython関数からの出力の抽出

InfForecastとInitialStorageには31個の異なる入力を使用して最適化を実行する必要があります(現在は最大10,000個の入力と独立した最適化を実行できます)。私は、マルチプロセッシングを使って複数の独立した最適化を同時に処理することをスピードアップできることを期待していました。私が望むのは、(5,31)次元を持つ配列 "Nextday"に出力される出力(各最適化の5つの値)です。それは書かれたコードが空であるかアクセスできないということを得たので、次の日の出力と思われます。値を抽出/アクセスして翌日に配置するにはどうすればよいですか?

注:関数main(...)は非常に複雑な最適化問題です。私は問題がそれを提供することなく理解するのは簡単だと思う。それは私がそれをループして、範囲(31)の各iに対してそれを呼び出すときに機能します。これに加えて

from multiprocessing.pool import ThreadPool as Pool 
Nextday=np.zeros((5,31)) 
pool_size = 4 # Should I set this to the number of cores my machine has? 
pool = Pool(pool_size) 

def optimizer(InfForecast, InitialStorage): 
    O=main(InfForecast,InitialStorage)   
    return [O[0][0], O[0][1], O[0][2], O[0][3], O[0][4]] 


for i in range(31): 
    pool.apply_async(optimizer, (InfForecast[i],InitialStorage[i])) 

pool.close() 
Nextday=pool.join()   

、私は、これは物事を行うための最善の方法であるかどうかはわかりません。それが動作している(私はそれが確信していない)確かに遅いようです。私はマルチスレッド対スレッドを行う方が良いかもしれないと読んでいましたが、これはスレッディングと思われますか?もし私が間違っているなら、私を許してください。

コード内のコメントでわかるように、pool_sizeを選択する方法についても興味があります。私は最終的にクラウドサーバ上でこれを実行している可能性があるので、私が使用したいと思うpool_sizeが自分のマシン上で使用する数字と少し異なると思います。コアの数だけですか?

アドバイスをいただければ幸いです。

+0

あなたはpool.mapを見ましたか? – thebjorn

+0

私はドキュメンテーションを見てきましたが、それはすべて私の頭の上にあります。私はプログラミングにはかなり新しいです。それは私の特定の場合にそれを使用する方法は私には分かりません。 – Kingle

答えて

1

あなたがマルチプロセッシングを行いたい場合は、

from multiprocessing.pool import Pool 

を使用する必要があります。

プールのサイズは、自分でマシンを持っている場合はmultiprocessing.cpu_count()とし、手動で調整して最適な効果が得られるようにしてください。あなたのプロセスがCPUバインドであれば、コアを利用可能にしておくと、マシンのレスポンスを向上させることができます。もしあなたのコードがCPU以外のプロセスを持つことができれば(コアをチューニングする必要はありません。 )。

マルチプロセッシングを実行しているとき(またはそれ以外のとき)は、ファイルの最上位にコードを入れないでください。機能のすべてを入れてからスタート機能を呼び出します(余談

if __name__ == "__main__": 
    my_start_function() 

:変数名が本当に悪いです、そしてあなたはOのような特定のフォントではほとんど読めないですステートメントを取得するようオハイオ州の首都を使用して、[0] [0 ])。通常のPythonで

は、map機能は、この等式で、「定義された」されていますので、

map(fn, lst) == [fn(item) for item in lst] 

プール法(IMAP/imap_unordered /マップ/ map_asyncは)同じような意味を持っており、あなたのケースでは、あなたは呼ぶだろう彼らは好き:

def my_start_function(): 
    ... 
    results = pool.map(optimizer, zip(InfForecast, InitialStorage)) 

マップ機能が機能し、リストを取るので、私は、各項目は、それが好きなように機能し、その引数(のそれぞれから一つの要素を持つリストを作成するzip機能を使用しましたジッパー)。

+0

ありがとう@thebjorn。 InfForecastが配列で、InitialStorageがfloatの場合はどうなりますか?私はさまざまな次元のものを詰めることができますか?また、最適化から最適化に変更されない多くの追加の引数があります。この引数は、例の簡略化のために取り出したものです。 – Kingle

+1

zipの使用を継続したい場合は、 'itertools'モジュールの関数を見てください。ただし、任意の方法で引数リストを作成することができます。 mapの2番目の引数はリストであり、各要素には関数の1回の呼び出しの引数が含まれていることに留意してください。 – thebjorn

+0

30種類の "InfForecast"配列を持つ関数の呼び出しを30回呼び出す方法はありますか? – Kingle

関連する問題