私はscipy.optimize.leastsq
を使用して機能を最適化するいくつかのリサーチコードに取り組んでいます。これは反復ごとに約18回実行されるので、実行時間を短縮するためにleastsqを並行して呼び出すことを希望します。これは、最適化がほぼ完全に独立しているため、ほとんど同期が必要ないため、問題ではありません。私は最近、明示的に共有メモリを設定することなくこれを行うことを可能にするmultiprocessing.pool.ThreadPool
について知りました。私のデータのほとんどはNumPy配列になっているので、痛みです。だから私はコードが動作することを期待して少し書き直しましたが、奇妙なエラーが発生します:SystemError: null argument to internal routine
。SciPy.optimizeとの平行性
次は私のコードを簡略化したものである:
def optfunc(id):
def errfunc(x):
return somedata[id] - somefunc(x)
lock.acquire()
x0 = numpy.copy(currentx[id])
lock.release()
result = scipy.optimize.leastsq(errfunc, x0)
lock.acquire()
currentx[id] = result
lock.release()
ThreadPool(processes=8).map(optfunc, range(idcount))
scipy.optimize.leastsq
がスレッドセーフでない場合を除きこれは、正常に動作する必要があります。だから私はロックを入れてみたscipy.optimize.leastsq
;それを見てください。しかし、プロセッサ使用率は100%で止まっているので、これは私には役に立たない。
ここで私の質問ができますか?私は私のオプションがあると思います:(?多分levmar、)
- LMのスレッドセーフな実装を探す
- プロセスではなく、スレッドを使用してみてください(私はこれが違いを生むだろうとは思わない)
ご意見やご提案をいただければ幸いです。
Windowsを使用していますか? Windowsの場合、optimize.leastsqのスレッディングに関する既知の問題があります。http://projects.scipy.org/scipy/ticket/1117 –
うーん、面白かったのは、私が検索したときに出てこなかった。私はUbuntuを使用していますが、おそらく両方のオペレーティングシステムに影響します。 – Steve