在多重處理中共享唯讀資料:複製還是共享?
在多處理環境中,資料共享對於效能最佳化至關重要。出現一個常見問題:唯讀資料是否在不同進程之間共用或複製?
提供的程式碼片段強調了有關將大型全域數組 (glbl_array) 傳遞到多處理池中的多個工作進程的問題。如果數組被共享或複製,就會出現問題,可能會導致大量記憶體開銷。
使用Numpy 和共享記憶體進行資料共享
確保共享存取為只讀data,答案中提到的一種方法是利用多處理的共享記憶體以及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>
此程式碼使用多處理套件建立共享記憶體物件 (shared_array_base),並將其轉換為 Numpy 陣列 (shared_array)。後續在工作進程中使用shared_array將會對共享記憶體進行操作,避免不必要的資料複製。
Linux中的Copy-on-Write語意
另外,值得注意的是Linux 在 fork() 上使用寫時複製語意。這意味著即使不使用明確共享記憶體技術,只讀資料也只會在修改時才會被複製。因此,只要數組保持不變,它就會被共享,而不會產生任何複製開銷。
結論
多處理中只讀資料是共享還是複製取決於具體實施。將 Numpy 與共享記憶體結合使用提供了一種確保資料共享的可靠方法,而 Linux 的寫入時複製語義也可能有助於避免不必要的複製。透過仔細考慮這些因素,程式設計師可以優化其多處理應用程式以實現高效的資料共享。
以上是只讀資料在多處理環境中共享或複製嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!