多くの同様の質問がありますが、答えは見つかりません。単純な配列には、マルチプロセッシングがあります。配列。スパース行列や他の任意のオブジェクトに対して、私はmanager.namespaceを見つける。そこで以下のコードを試しました:には、Pythonでマルチプロセッシングで読み取り専用の希薄な行列を共有する効率的な方法があります。
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人の作業者だけがデータにアクセスできるようにするからです。データは読み込み専用なので、実際にはロックは必要ありません。これを行うより効率的な方法がありますか?
p.s.私はcopy-on-write fork()について話しています。私はそれが何であるかは分かりませんが、うまくいきません。最初にAを生成してPool()を実行すると、各プロセスにAのコピーが作成されます。
ありがとうございます。
'multiprocessing.Manager'の代わりに[sharedmem](https://bitbucket.org/cleemesser/numpy-sharedmem/overview)を試してみてください。好奇心から - どのOSを使用していますか? – unutbu
@unutbuありがとうございます。私は共感を見るつもりです。私はクラスタ上のLinuxのVM上でそれを実行しています – user2727768