8

私は多くの同様の質問を見つけましたが、答えはありません。単純な配列には multiprocessing.Array があります。疎行列またはその他の任意のオブジェクトについては、manager.namespace を見つけます。だから私は以下のコードを試しました:

from scipy import sparse
from multiprocessing import Pool
import multiprocessing
import functools

def myfunc(x,ns):
    return ns.A[x,:]*ns.A*ns.A[:,x]

manager = multiprocessing.Manager()
Global = manager.Namespace()
pool=Pool()
Global.A=sparse.rand(10000,10000,0.5,'csr')
myfunc2=functools.partial(myfunc,ns=Global)
r=pool.map(myfunc2, range(100))

コードは機能しますが、効率的ではありません。実際に働いているのは 16 人の労働者のうち 4 人だけです。その理由は、マネージャーが一度に 1 人のワーカーしかデータにアクセスできないためだと思います。データは読み取り専用なので、ロックは必要ありません。これを行うためのより効率的な方法はありますか?

ps、copy-on-write fork() について話している人を見たことがあります。私はそれが何であるかをよく理解していませんが、うまくいきません。最初に A を生成して Pool() を実行すると、各プロセスに A のコピーが含まれます。

前もって感謝します。

4

1 に答える 1