我在嘗試優化使用mmap處理大型數據集。數據集是在千兆字節範圍內。這個想法是將整個文件映射到內存中,允許多個進程同時處理數據集(只讀)。它雖然沒有按預期工作。Linux/perl mmap性能
作爲一個簡單的測試,我簡單地mmap文件(使用perl的Sys :: Mmap模塊,使用我認爲直接映射到底層C函數的「mmap」子),並讓進程處於睡眠狀態。在執行此操作時,代碼花費超過一分鐘才從mmap調用返回,儘管此測試無法執行任何操作 - 即使是讀取操作,也不會執行mmap的文件。
猜測,雖然也許linux需要整個文件在第一次mmap化時被讀取,所以在文件在第一個進程中映射(當它正在休眠時)之後,我在另一個進程中調用了一個簡單的測試,試圖讀取文件的前幾兆字節。
令人驚訝的是,似乎第二個過程在從mmap調用返回之前花費了大量的時間,大約與第一次mmap處理文件的時間相同。
我已經確定MAP_SHARED正在被使用,並且第一次映射文件的過程仍然是活動的(它沒有終止,並且mmap沒有被映射)。
我期望一個mmapped文件可以讓我給多個工作進程有效地隨機訪問大文件,但是如果每個mmap調用都需要先讀取整個文件,那麼這有點困難。我還沒有測試過使用長時間運行的進程來查看第一次延遲後訪問是否快速,但我期望使用MAP_SHARED,而另一個單獨的進程就足夠了。
我的理論是,mmap會立即返回,linux會根據需要或多或少地加載塊,但是我看到的行爲是相反的,表明它需要讀取每個文件的整個文件調用mmap。
任何想法我做錯了,或者如果我完全誤解了mmap應該如何工作?
+1以瞭解詳細說明。 – RichieHindle 2009-06-27 21:06:25
使用3 arg形式的open()。 – 2009-06-28 03:55:23