IPythonの並列環境を使用しようとしていますが、これまでのところ、見栄えは良いですが、問題が発生しています。ライブラリで定義された関数があるとしましょう
def func(a,b):
...
これは、aの1つの値とbの値の束を評価するときに使用します。
[func(myA, b) for b in myLongList]
明らかに、実際の関数はもっと複雑ですが、問題の本質は、複数のパラメーターを必要とすることであり、そのうちの1つだけにマップしたいと思います。問題は、map、@dview.parallelなどがすべての引数にマップされることです。
それで、func(myA、myLongList)の答えを取得したいとしましょう。これを行うための明白な方法は、functools.partialまたはちょうど同じようにカレーすることです
dview.map_sync(lambda b: func(myA, b), myLongList)
ただし、これはリモートマシンでは正しく機能しません。その理由は、ラムダ式を選択すると、myAの値が含まれず、代わりに、リモートマシンのローカルスコープからのmyAの値が使用されるためです。クロージャがピクルスになると、クロージャが閉じる変数はピクルスになりません。
これを実際に機能させると考える2つの方法は、すべての引数のリストを手動で作成し、すべての引数に対してマップを機能させることです。
dview.map_sync(func, [myA]*len(myLongList), myLongList)
または、データを関数のデフォルト引数として恐ろしく使用し、強制的にピクルスにします。
# Can't use a lambda here b/c lambdas don't use default arguments :(
def parallelFunc(b, myA = myA):
return func(myA, b)
dview.map_sync(parallelFunc, myLongList)
実際、実際の関数が多くのパラメーターを取り、より複雑な場合、これはすべてひどく歪んでいるように見えます。これを行うための慣用的な方法はありますか?何かのようなもの
@parallel(mapOver='b')
def bigLongFn(a, b):
...
しかし、私が知る限り、「mapOver」のようなものは存在しません。私はおそらくそれをどのように実装するかについての考えを持っています...これはサポートが存在するはずの非常に基本的な操作のように感じるので、何かが足りないかどうかを確認したいと思います。