Сопоставление файлов размером более 2 ГБ с Java - PullRequest
11 голосов
/ 23 февраля 2011

В целом можно сказать: как реализовать метод byte[] get(offset, length) для файла с отображением в памяти, размер которого превышает 2 ГБ в Java.

С контекстом:

Япытаясь эффективно читать файлы размером более 2 ГБ со случайным вводом / выводом.Конечно, идея состоит в том, чтобы использовать Java nio и API с отображением памяти.

Проблема заключается в ограничении 2 ГБ для отображения памяти.Одним из решений было бы сопоставить несколько страниц размером 2 ГБ и индексировать смещение.

Здесь есть похожее решение:

Двоичный поиск в отсортированном виде (отображен в память?)файл на Java

Проблема этого решения заключается в том, что оно предназначено для чтения байтов, в то время как мой API должен читать byte[] (поэтому мой API будет выглядеть как read(offset, length)).

Сработает ли изменение этого предельного get() на get(offset, length)?Что происходит, когда byte[], который я читаю, лежит между двумя страницами?

1 Ответ

4 голосов
/ 06 апреля 2011

Нет, мой ответ на Бинарный поиск в отсортированном (отображенном в памяти?) не будет работать, чтобы изменить get() на get(offset, length) из-за границы массива отображаемого в памяти файла, как вы подозреваете.Я вижу два возможных решения:

  1. Перекрытие файлов отображения памяти. Когда вы выполняете чтение, выберите файл отображения памяти с начальным байтом непосредственно перед начальным байтом чтения.Этот подход не будет работать для операций чтения, превышающих 50% от максимального размера карты памяти.
  2. Создайте метод создания массива байтов, который читает из двух разных двух разных файлов отображения памяти. I 'Мне не нравится этот подход, так как я думаю, что некоторые из приростов производительности будут потеряны, потому что результирующий массив не будет отображаться в памяти.
...