Сопоставление файлов размером более 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% максимального размера карты памяти.
- Создайте метод создания массива байтов, который читает из двух разных двух файлов с отображением памяти. Я не увлекаюсь этим подходом, так как я думаю, что некоторые выгоды от производительности будут потеряны, потому что результирующий массив не будет отображаться в памяти.