ホームページ  >  記事  >  バックエンド開発  >  メモリ オーバーヘッドを発生させずに、マルチプロセッシングで大規模な読み取り専用配列と Python オブジェクトを共有する方法

メモリ オーバーヘッドを発生させずに、マルチプロセッシングで大規模な読み取り専用配列と Python オブジェクトを共有する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-11-03 20:19:03481ブラウズ

How to Share Large, Read-Only Arrays and Python Objects in Multiprocessing without Memory Overhead?

マルチプロセッシングにおける共有メモリ オブジェクト

質問:

マルチプロセッシングでは、大規模な読み取りオブジェクトをどのように共有できますか?メモリ オーバーヘッドを発生させずに、複数のプロセスに配列または任意の Python オブジェクトだけを使用できますか?

答え:

copy-on-write fork() セマンティクスを使用するオペレーティング システムでは、変更されていないデータ構造は、メモリを追加消費することなく、すべての子プロセスで引き続き利用できます。共有オブジェクトが変更されていないことを確認してください。

配列の場合:

効率的なアプローチ:

  1. パック配列を効率的な配列構造 (例: numpy 配列) に変換します。
  2. 配列を共有メモリに配置します。
  3. 共有配列を multiprocessing.Array でラップします。
  4. 共有配列を渡します。配列を関数に追加します。

書き込み可能な共有オブジェクト:

  • 同期またはロックが必要です。
  • マルチプロセッシングは 2 つの機能を提供しますメソッド:

    • 共有メモリ: 単純な値、配列、または ctypes (高速) に適しています。
    • マネージャー プロキシ: プロセス保持メモリ、およびマネージャーが他のユーザーからのアクセスを調停します (シリアル化/逆シリアル化により遅くなります)。

任意の Python オブジェクト:

  • マネージャー プロキシ アプローチを使用します。
  • 通信オーバーヘッドのため、共有メモリよりも遅くなります。

最適化に関する懸念事項:

オーバーヘッド提供されたコード スニペットで観察された問題は、メモリのコピーによって引き起こされたものではありません。代わりに、関数の引数 (arr 配列) のシリアル化/逆シリアル化が原因で発生し、Manager プロキシを使用するときにパフォーマンスが低下します。

以上がメモリ オーバーヘッドを発生させずに、マルチプロセッシングで大規模な読み取り専用配列と Python オブジェクトを共有する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。