2011-12-12 24 views
10

下面是情況:我有一個巨大的對象,需要加載到內存中。這麼大,如果它被加載兩次,它會超出我的機器上的可用內存(不,我不能升級內存)。我也不能把它分成任何小塊。爲了簡單起見,我們只是說對象是600 MB,而我只有1 GB的RAM。我需要從一個Web應用程序中使用這個對象,該應用程序運行在多個進程中,並且我不控制它們是如何產生的(第三方負載平衡器是這樣做的),所以我不能僅僅依靠創建對象在一些主線程/進程中,然後產生孩子。這也消除了使用像POSH這樣的東西的可能性,因爲它依賴於它自己的自定義分叉調用。我也不能使用像SQLite內存數據庫,mmap或posix_ipc,sysv_ipc和shm模塊之類的東西,因爲這些模塊充當內存中的文件,並且這些數據必須是我使用它的對象。使用其中的一種,我必須將它作爲一個文件讀取,然後在每個單獨的進程和BAM中將其轉換爲對象,由於我只是嘗試加載第二個副本,因此會超出機器的內存限制而導致分段錯誤。如何將Python對象存儲在內存中供不同進程使用?

必須有一些方法可以將Python對象存儲在內存中(而不是作爲文件/字符串/序列化/醃製)並讓它可以從任何進程訪問。我只是不知道它是什麼。我已經看遍了所有的StackOverflow和谷歌,找不到答案,所以我希望有人能幫助我。

+0

我不確定你的意思是「因爲那些在內存中充當文件」。共享內存是一塊內存,而不是一個文件。您可以使用該內存來存儲任何內容,包括對象。這在Python中可能不是那麼明顯,但在C中是這樣。這是否必須是一個純Python解決方案,或者你會考慮一個混合的Python/C或Python/C++解決方案來通過C/C++綁定間接訪問對象到共享內存中的對象嗎? –

+0

因爲這些東西在內存中充當文件,所以請參閱http://docs.python.org/library/mmap.html。 –

+1

像Python的Memcached可以提供幫助嗎? – doremi

回答

4

http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes

查找共享存儲器,或者服務器的過程。重新閱讀你的文章後,服務器進程聽起來更接近你想要的。

http://en.wikipedia.org/wiki/Shared_memory

+0

服務器進程部分的底部是: 「服務器進程管理器比使用共享內存對象更靈活,因爲它們可以支持任意對象類型,而且,單個管理器可以被不同計算機上的進程共享通過網絡。「 這是非常有趣的,可能正是我需要的,但我似乎無法找到如何做到這一點的好文檔。搜索「python服務器進程」會產生模糊的結果。你知道任何好的資源嗎? – Brendan

+0

爲了迴應我的最後一條評論,它實際上只是在同一頁的不同部分:http://docs.python.org/library/multiprocessing.html#multiprocessing.managers.BaseManager.connect 太棒了!這完全是爲我工作。 – Brendan

1

我會實現這個作爲被導入到每個Python腳本C模塊中。然後,這個大對象的接口將用C語言或C和Python的組合來實現。

1

必須有某種方式在存儲器中存儲一個Python對象(而不是作爲一個 文件/串/串行化/酸洗),並有它是來自任何 進程訪問。

這不是工作方式。 Python對象引用計數和對象的內部指針在多個進程中沒有意義。

如果數據不一定是實際的Python對象,您可以嘗試處理存儲在mmap()或數據庫中的原始數據。

相關問題