Java MemoryMapping большие файлы - PullRequest
4 голосов
/ 15 апреля 2011

Ограничение Java для MappedByteBuffer до 2GIG усложняет использование для отображения больших файлов.Обычный рекомендуемый подход - использовать массив MappedByteBuffer и индексировать его через:

long PAGE_SIZE = Integer.MAX_VALUE;
MappedByteBuffer[] buffers;

private int getPage(long offset) {
    return (int) (offset / PAGE_SIZE)
}

private int getIndex(long offset) {
    return (int) (offset % PAGE_SIZE);
}

public byte get(long offset) {
    return buffers[getPage(offset)].get(getIndex(offset));
}

. Это может работать для отдельных байтов, но требует переписывания большого количества кода, если вы хотите обрабатывать операции чтения / записи, которыебольше и требуют пересечения границ (getLong () или get (byte [])).

Вопрос: какова ваша лучшая практика для подобных сценариев, знаете ли вы какое-либо работающее решение / код, который может бытьповторно использовать без повторного изобретения колеса?

1 Ответ

5 голосов
/ 29 апреля 2011

Вы проверяли dsiutil's ByteBufferInputStream?

Javadoc

Основная полезность этого класса - возможность создания потоков ввода, которые действительно основаныв MappedByteBuffer.

В частности, фабричный метод map(FileChannel, FileChannel.MapMode) преобразует в память весь файл в массив ByteBuffer и предоставляет массив как ByteBufferInputStream.Это позволяет получить доступ к легко сопоставленным файлам размером более 2 ГБ.

  • long length()
  • long position()
  • void position(long newPosition)

Это то, о чем вы думали? Это тоже LGPL .

...