マルチプロセッシング用の共有メモリで NumPy 配列を使用する
Python でマルチプロセッシングを使用する場合、プロセス間で配列を共有するのは困難な場合があります。 NumPy 配列を単純な ctypes 配列ではなく NumPy 配列のように動作させる必要がある場合、マルチプロセッシングで NumPy 配列を使用すると、問題が発生する可能性があります。
問題ステートメント
提供された例では、NumPy 配列は ctypes Array() オブジェクトでラップされます。これにより、ctypes 方式で配列にアクセスできるようになりますが、NumPy 配列の機能は失われます。 -1*arr や arr.sum() のような操作は実行できず、NumPy 配列に変換し直すと共有メモリが破損します。
shared_arr.get_lock() を使用した解決策
共有メモリ配列の使用中に NumPy 配列の機能を保持するには、共有メモリ配列から利用可能な get_lock() メソッドを使用できます。 array:
shared_arr = mp.Array(ctypes.c_double, N) def f(i): with shared_arr.get_lock(): arr = np.frombuffer(shared_arr.get_obj()) arr[i] = -arr[i]
get_lock() メソッドを使用すると、共有配列へのアクセスを同期し、プロセス内で NumPy 配列のように確実にアクセスできるようにします。
例
次のコードは、共有を利用しながら NumPy 配列の機能を保持する改良された例を提供します。 Memory:
import multiprocessing as mp import numpy as np N = 100 shared_arr = mp.Array(ctypes.c_double, N) arr = np.frombuffer(shared_arr.get_obj()) # Fill the shared array with random values arr[:] = np.random.uniform(size=N) # Create a pool of processes with mp.Pool(initializer=init, initargs=(shared_arr,)) as pool: # Define functions that modify the shared array def f(i): with shared_arr.get_lock(): arr -= 1 # Subtract 1 from each array element within the process pool.map(f, range(N)) # Check the modified shared array assert np.allclose(arr, -1)
この例では、init() 関数が各プロセスのshared_arr を設定し、f() 関数がロック内の共有配列に対して動作します。変更された共有アレイは、プールに参加した後、メイン プロセスからアクセスできるようになります。このメソッドは、マルチプロセッシングで共有配列を使用する、同期された NumPy 互換の方法を提供します。
以上がPython でマルチプロセッシングのために共有メモリ内の NumPy 配列を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。