MappedByteBuffer раздвижное окно - PullRequest
6 голосов
/ 05 марта 2012

Есть ли способы заставить MappedByteBuffer иметь скользящее окно в файле.У меня есть очень большой файл (20 ГБ), но я хочу сделать только 100 МБ за раз.Я пробовал это, просто отбрасывая старый буфер и создавая новый из канала, но это пожирает память, так как старые буферы, похоже, не используются повторно.

Есть идеи?

1 Ответ

3 голосов
/ 05 марта 2012

Вы можете заставить старый буфер немедленно освободить память с помощью

((DirectBuffer) buffer).cleaner().clean();

Отказ от ответственности: я использовал это только с Sun / Oracle / OpenJDK Java 6 обновление 18 и более поздние версии. Он может быть недоступен или работать некорректно со старыми версиями или другими платформами. Спасибо @ EJP.


Если у вас нет 32-битной ОС, я бы просто отобразил весь файл в память (используя несколько отображений). Это будет намного эффективнее и проще в управлении. В этой ситуации я очищаю ByteBuffers только как часть закрытия файла (в модульных тестах)

Вы можете использовать ТБ виртуальной памяти и использовать очень мало физического или даже дискового пространства. В этом примере я сопоставляю 8 ТБ виртуальной памяти на машине с 24 ГБ памяти и диском на 120 ГБ.

http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

В итоге: на 64-битной машине виртуальная память удивительно дешевая, вам не о чем беспокоиться.

Кстати: большинство 64-битных машин фактически ограничены 48-битной виртуальной памятью. Это предел 256 ТБ, а не 16 ЭБ (18 000 000 ТБ), которые они могут решить теоретически.


Вы можете найти эту библиотеку интересной. Я не упоминал об этом раньше, поскольку он может не подходить для вас, но вы можете найти подход и некоторые методы, которые я использую в коде, интересными.

https://github.com/peter-lawrey/Java-Chronicle

...