2011-08-26 5 views
1

mmap이 가상 메모리를 사용하는 것처럼 빠르지는 않지만 여전히 하드 디스크 I/O를 가지고 있다고 생각합니다.왜 사람들은 MappedByteBuffer에 의한 mmap이 빠르다고 말합니까?

그러나 인터넷에있는 많은 사람들이 빠르다고 말하고 있지만 이유는 없습니다.

제 테스트에서 BufferedReader 및 MappedByteBuffer를 사용하여 파일을 읽었습니다. 첫 번째 파일은 더 빠릅니다.

+3

실제로 수행되는 작업에 따라 다릅니다. 파일을 순차적으로 읽는다면 간단한 BufferedReader *를 사용하십시오. MappedByteBuffer/mmap은 일반적으로 매우 구체적인 방식으로 물리적 구조에 의존하는보다 고급 유스 케이스 (및 RandomAccessFile이 제공 할 수있는 것 외의 것들)를위한 것입니다. –

+0

고급 유스 케이스 또는 URL에 대해 말할 수 있습니까? :) – Hesey

+0

전제의 일부가 잘못되었습니다. mmap *은 가상 메모리입니다. 시스템 수준에서 그들은 같은 것입니다. –

답변

8

MappedByteBuffer은 순차적으로 읽지 않는 이진 파일을 읽는 데 적합합니다.

예를 들어, 파일 오프셋이있는 트리 데이터 구조를 포함하는 데이터베이스 인덱스 파일을 파일의 다른 부분으로 읽는 중입니다. 이 의 경우 파일에서 앞뒤로 지속적으로 검색 중이며 데이터를 읽고 테스트 결과 MappedByteBuffer을 사용하면 RandomAccessFile을 사용하는 것보다 훨씬 빠릅니다.

BufferedReader 또는 BufferedInputStream으로 텍스트 파일이나 이진 파일을 순차적으로 읽는 것이 효율적입니다. 일반적으로 에 메모리 매핑 파일을 사용하면 이점이 없으므로 메모리 매핑을 관리하는 오버 헤드가 일 때 또는 BufferedInputStream보다 느리게 MappedByteBuffer이됩니다.

+0

"메모리 매핑 관리 오버 헤드" MappedByteBuffer는 값이 싼 mmap()로 직접 변환해야합니다. 오버 헤드는 ByteBuffer에서 표준 Java 유형으로 데이터를 이동하는 오버 헤드라고 생각합니다. 천천히. –

+0

무시할 수 있기 때문에 읽기 전용으로 매핑 된 파일은 힙 크기에 거의 영향을 미치지 않는다는 것을 언급 할 가치가 있습니다. –

1

mmap이 더 빠른 이유는 파일이 메모리에 한 번에 모두 읽히지 않기 때문입니다. 파일은 메모리의 주소에 매핑되므로 처리 할 필요가없는 파일의 일부를로드하지 않고 순차적이지 않은 방식으로 파일에 액세스 할 수 있습니다.

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

이 특정 응용 프로그램의 일종이지만, 정말 일반적으로 메모리에 맞지 않을 큰 부분적으로 만 처리되는 파일과 파일을 의미합니다. 공유 메모리 및 공유 객체와 같은 다른 사용 사례가 있습니다. 동적으로 링크 된 라이브러리는 mmap을 사용하여로드되므로 사용하려는 모든 프로세스에 대해 디스크에서로드 할 필요가 없습니다. 공유 라이브러리를 사용하는 두 번째 프로세스는 실제로 첫 번째 프로세스와 동일한 실제 메모리를보고 있습니다.

관련 문제