マルチプロセッシングでの共有読み取り専用データの維持
質問:
Python マルチプロセッシング環境では、コピーを作成せずに、大きな読み取り専用配列 (例: 3 Gb) を複数のプロセス間で確実に共有するにはどうすればよいですか?
回答:
マルチプロセッシング モジュールと NumPy を併用すると、プロセス間でデータを効率的に共有できます。
<code class="python">import multiprocessing import ctypes import numpy as np shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10) shared_array = np.ctypeslib.as_array(shared_array_base.get_obj()) shared_array = shared_array.reshape(10, 10)</code>
このアプローチは、Linux が fork() にコピーオンライト セマンティクスを採用しているという事実を活用し、データが重複する場合にのみ複製されるようにします。変更されました。その結果、明示的に multiprocessing.Array を使用しなくても、変更されない限り、データはプロセス間で効果的に共有されます。
<code class="python"># Parallel processing def my_func(i, def_param=shared_array): shared_array[i,:] = i if __name__ == '__main__': pool = multiprocessing.Pool(processes=4) pool.map(my_func, range(10)) print(shared_array)</code>
このコードは共有配列を同時に変更し、複数のプロセス間でデータが正常に共有されることを示します。
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.] [ 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.] [ 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.] [ 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.] [ 6. 6. 6. 6. 6. 6. 6. 6. 6. 6.] [ 7. 7. 7. 7. 7. 7. 7. 7. 7. 7.] [ 8. 8. 8. 8. 8. 8. 8. 8. 8. 8.] [ 9. 9. 9. 9. 9. 9. 9. 9. 9. 9.]]
共有メモリとコピーオンライト セマンティクスを活用することで、このアプローチは、マルチプロセッシング環境のプロセス間で大量の読み取り専用データを共有するための効率的なソリューションを提供します。
以上がPython マルチプロセッシングで大規模な読み取り専用データを効率的に共有するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。