2017-06-16 39 views
0

我也有類似的對這個問題的情況:通過映射位於ramdisk上的numpy數組強加的開銷是多少?

Share Large, Read-Only Numpy Array Between Multiprocessing Processes

除此之外,我肯定想整個數組住在RAM一個顯著的差異。爲了清晰起見,需要重申:

我想在多個進程之間共享一個相當大的numpy數組,只讀,並將整個數組保存在RAM中以獲得絕對最佳性能。只有linux的解決方案很好。我也希望在生產環境中工作,所以寧願避免將依賴項放在研究型軟件包上,或者做任何事情。

對於這種情況,在我看來,numpy-sharedmem風格的方法是矯枉過正。仍然脫穎而出的方法是:

  1. 在其他線程here建議,將陣列保持爲一個全局變量,只是fork()。這似乎會盡可能快。多個進程最終會以任何方式在共享內存頁面上進行競爭,或者以某種方式干擾對方的緩存,從而導致一些開銷而不是單進程方案?

    雖然由於像this one這樣的評論,我仍然對這種方法持懷疑態度。在我的多處理環境中嘗試使用fork()也可能不方便(我很可能在此時使用Twisted)。

  2. 雖然numpy的內置內存映射was在另一個線程中出現,但它明顯面向比主內存大的數組。我不相信我已經看到在stackoverflow上討論以下可能性:爲什麼不把npy文件放到一個ramdisk中並將它映射(mmap_mode='r')以獲得簡單而穩定的只讀內存共享numpy數組?

    這裏的性能考慮是什麼?與fork()方法有很大不同,還是像numpy-sharedmem這樣的真正的共享內存方法? numpy中的mmap圖層會產生多少開銷?當npy文件放在ramdisk上時,連續性是否重要?緩存區域是否受到影響?進程之間會有爭用嗎?

我傾向於選擇2單獨的穩定因素,但想了解可能的性能差異,並理解爲什麼MMAP +虛擬盤可能是許多應用類似的或不那麼快速和簡單的解決方案類似於我的。

+0

Linux上的共享內存已經作爲mmp在tmpfs上實現,所以沒關係。 –

回答

0

使用ramdisk將涉及訪問文件系統所涉及的所有開銷,在ramdisk和複製數據的頁面緩存之間複製數據。

如果您使用ramfs,將不會有開銷訪問將被鎖定在RAM中的數據。但這意味着其他數據將無法保存在RAM中,可能會降低檢修性能。

使用tmpfs具有與匿名內存類似的性能。