共有メモリ内の Numpy 配列をマルチプロセッシングに使用する
マルチプロセッシングのシナリオでは、numpy 配列に共有メモリを使用するのが一般的です。ただし、単なる ctypes 配列ではなく、numpy 配列としての可能性を最大限に活用することは困難な場合があります。
解決策は、マルチプロセッシング モジュールの mp.Array() を活用することにあります。この関数を使用すると、複数のプロセスが同時にアクセスできる共有配列を作成できます。これらの配列に numpy 配列としてアクセスするには、データ コピーのオーバーヘッドを発生させずに numpy.frombuffer() を使用できます。
例:
import multiprocessing as mp import numpy as np def f(shared_arr): arr = np.frombuffer(shared_arr.get_obj()) arr[:] = -arr[:] if __name__ == '__main__': N = 10 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Create, start, and finish child processes p = mp.Process(target=f, args=(shared_arr,)) p.start() p.join()
この例では、 f() 関数は共有配列を使用して要素ごとの否定を実行します。 numpy 配列として配列にアクセスすると、そのすべての強力な操作とメソッドにアクセスできるようになります。
同期:
複数のプロセスが同じ共有配列にアクセスする場合、同期紛争を防ぐために重要です。 mp.Array() は、必要に応じてアクセスを同期できる get_lock() メソッドを提供します。
# ... def f(i): with shared_arr.get_lock(): # synchronize access arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
このアプローチを利用すると、numpy 配列としての完全な機能を維持しながら、マルチプロセッシング環境で numpy 配列を共有できます。
以上がマルチプロセッシング用に共有メモリ内の NumPy 配列を効率的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。