2013-03-25 76 views
1

我有一個50GB的文件,這是一個排序的CSV文件。執行mmap時,C或Java會有什麼顯着的性能差異?

如果我正在使用C或java使用內存映射訪問執行對此文件的查找,理論上會有什麼區別嗎?

我猜是因爲文件訪問被推到操作系統級別,它真的不應該有太大的區別是正確的嗎?

回答

2

理論,Java將是因爲需要對由於Java的面向對象的方法調用,並且可能由於需要跨越的Java/JNI邊界附加間接尋址無窮慢。

練習,Hotspot編譯器優化了直接的ByteBuffer訪問,並且頁面錯誤的代價將遠遠超過額外的內存間接。

+1

作爲一個評論,我會將CSV轉換爲固定長度的二進制格式以供使用。 – parsifal 2013-03-25 15:20:27

+0

java可以執行大於10GB的內存映射文件嗎?任何限制? – loyalflow 2013-03-25 18:26:03

+0

@ user1361315 - 您可能需要使用'-XX:MaxDirectMemorySize'選項(例如:'-XX:MaxDirectMemorySize = 64g'。這是作爲映射緩衝區的垃圾回收的內部觸發器。我不確定哪些版本需要它;肯定是1.6,我預計也是1.7。 – parsifal 2013-03-25 18:38:34

1

直接回答問題。

C的mmap()和Java的FileChannel.map()被認爲是相當多的等價物,不會有顯着的性能差異。

1

Java一次只能映射2 GB。這是因爲ByteBuffer在長度,大小等方面使用32位整數。因此,對於50 GB文件,您需要25 mmaps。 C可以創建一個mmap,儘管它不能移植到20世紀90年代的計算機(如果你關心的話)

相關問題