首頁  >  文章  >  後端開發  >  如何在多處理中共享大型唯讀數組和 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 物件跨多個進程而不會產生記憶體開銷?

答案:

在使用寫時複製fork() 語義的作業系統中,未更改的資料結構仍然可供所有子進程使用,而無需額外的記憶體消耗。只需確保共享物件保持不變即可。

對於數組:

高效方法:

  1. 打包數組轉換為高效能的數組結構(例如numpy數組)。
  2. 將陣列放入共享記憶體中。
  3. 用 multiprocessing.Array 包裝共享陣列。
  4. 傳遞共享記憶體數組到您的函數。

可寫入共享物件:

  • 需要同步或鎖定。
  • 多處理提供兩個方法:

    • 共享記憶體:適用於簡單值、陣列或ctypes(快速)。
    • 管理器代理:進程持有內存,管理器仲裁其他人的存取(由於序列化/反序列化而速度較慢)。

任意 Python 物件:

  • 使用管理器代理程式方法。
  • 由於通訊開銷,比共享記憶體慢。

最佳化問題:

開銷在提供的程式碼片段中觀察到的情況不是由記憶體複製引起的。相反,它源自於函數參數(arr 數組)的序列化/反序列化,這在使用 Manager 代理程式時會導致效能損失。

以上是如何在多處理中共享大型唯讀數組和 Python 物件而不產生記憶體開銷?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn