2015-08-22 96 views
5

不同進程之間的大對象我想分享在Python不同進程之間的大對象(〜2 GB),以減少對內存的使用情況。我已經瞭解了多處理庫中的Manager類和代理(https://docs.python.org/3.4/library/multiprocessing.html#multiprocessing-managers)。但是,根據文檔和其他Stackoverflow用戶,在使用像這樣的大對象時,這可能會非常慢。這是否正確,如果是這樣,是否還有另一個更快的Python庫或函數?謝謝。共享在Python 3.4

編輯:我創建的對象是一個DAG(有向非循環圖),其構造由標準蟒值,雖然。

+1

你說的「共享」的意思是 - 讀或變異? – FMc

+0

我的意思是讀。我不以任何方式改變對象。 –

+0

你看過mmap嗎? –

回答

1

如果您的數據被限制在標準值和陣列(沒有任何其他Python對象),可以使用共享存儲器(值()和陣列(),見https://docs.python.org/3.4/library/multiprocessing.html#shared-ctypes-objects)。它非常快。

+0

對不起,不明確,但它是一個用戶定義的對象,其構造函數雖然由標準的python值組成。它會在這種情況下仍然有效嗎? –

+0

它看起來不像它的作品,因爲我的用戶定義的對象當然不是ctype ojbect。 –

1

問題的一個解決方案是使圖形成一個處理程序,該處理程序公開使用代理從其他進程執行的方法。這意味着你必須建立一個類似於manager.dictmanager.value的類。 這是通過生產者/消費者模式完成的。它被稱爲進程間調用(IPC)或遠程過程調用(RPC)。解決方案可能涉及zerolesspyro

另一種解決方案,那就是簡單

另一種解決方案是使用一個數據庫。例如,bsddblmdb,它們至少支持對數據庫的多進程讀取訪問。使用ajguthe simpler design。可以避免你寫很多代碼。

最後的解決方案,是建立在你的mmap內存,並從它們的讀取文件。但是這是一個真正的解決方案,因爲您的圖是隻讀的,因爲如果您希望修改圖,您需要開始編寫一個mmap圖形數據庫。這具有完全在內存中的優勢。

我的建議是使用lmdb建立以爲例,從ajgu的簡化版本圖形數據庫有兩個腳本:

  • 來創建數據庫
  • 將使用該圖從不同的另一類處理。
+0

如果你想討論關於它在[new new forge](https://github.com/amirouche/AjguDB)上跳轉的問題,我是AjguDB的主角。 – amirouche