2011-08-26 155 views
1

我認爲mmap不像使用虛擬內存那麼快,它仍然有硬盤I/O。爲什麼人們說MappedByteBuffer的mmap速度更快?

但互聯網上的很多人都說這很快,但沒有理由。

在我的測試,我讀使用的BufferedReader andMappedByteBuffer文件,第一個是速度更快。

+3

這確實取決於正在完成的操作。如果通過文件順序讀取,那麼*請使用簡單的BufferedReader *。 MappedByteBuffer/mmap用於更高級的用例(甚至是RandomAccessFile可以提供的用例),它們通常以非常特定的方式依賴於物理結構。 – 2011-08-26 06:18:33

+0

你能說一些高級用例或任何URL嗎? :) – Hesey

+0

前提的一部分是不正確的。 mmap *是*虛擬內存;在系統層面上,他們是一回事。 –

回答

8

A MappedByteBuffer適合讀取不順序讀取的二進制文件。

一個例子讀取包含 樹數據結構與文件偏移到該文件的其它部分的數據庫索引文件。在此 的情況下,您不斷地在文件中尋找前進和後退,並且 讀數據和 我的測試顯示使用MappedByteBuffer比使用 RandomAccessFile快得多。

BufferedReaderBufferedInputStream順序讀取文本文件或二進制文件是有效的。通常有使用 內存映射文件對此沒有優勢和管理內存映射 將可能使比BufferedReaderBufferedInputStream一個MappedByteBuffer較慢的開銷。

+0

管理內存映射的開銷是多少? MappedByteBuffer應該直接轉換成mmap(),這很便宜。我認爲您看到的開銷是將數據從ByteBuffer移動到任何標準Java類型的開銷;這很慢。 –

+0

也許值得一提的是,只讀映射文件幾乎不會影響堆大小,因爲它是可丟棄的。 –

1

mmap更快的原因是文件不是一次全部讀入內存。該文件映射到內存中的地址,並且可以以非順序的方式訪問它,而無需加載不需要處理的文件部分。

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

這是某種特定應用的,但它確實是用於那些僅部分處理通常不會裝入內存大文件和文件。還有其他用例,如共享內存和共享對象。使用mmap加載動態鏈接的庫,以便不需要爲每個想要使用它們的進程從磁盤加載它們。第二個使用共享庫的進程實際上是在查看與第一個進程相同的物理內存。

相關問題