Сопоставление файлов размером более 2 ГБ с помощью Java

В целом можно сказать: как реализовать метод 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

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

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