Отображение памяти большого файла на Android в Java работает хорошо. Но при сопоставлении более чем 1,5 ГБ в общей сложности даже при множественных вызовах отображения он терпит неудачу:
mmap failed: ENOMEM (Out of memory)
Смотрите полное обсуждение здесь. Примечание. Это не сбой на сервере Linux. Андроид: largeHeap = "true" для приложения.
Следующий код Java вызывается несколько сотен раз, запрашивая ~ 1 МБ за вызов:
ByteBuffer buf = raFile.getChannel().map(allowWrites ? FileChannel.MapMode.READ_WRITE : FileChannel.MapMode.READ_ONLY, offset, byteCount);
чтобы избежать запроса одного большого смежного фрагмента памяти, который часто бывает сложнее найти. Полный текст здесь. Имейте в виду, что удвоение размера сегмента (т.е. Размера одного вызова карты) не имеет эффекта, что означает, что он останавливается в аналогичной позиции памяти. Также важно отметить, что 2 приложения с чуть меньшим лимитом выполняют штраф (намекая на ограничение для каждого процесса).
Связанные вопросы здесь, здесь, здесь, здесь, здесь, здесь, здесь и здесь.
Будет ли использоваться несколько файлов вместо одного файла с несколькими сопоставлениями?
Я читал, что это может быть ограничение для каждого процесса для виртуального адресного пространства. Где я могу найти больше об этом? Могу ли я изменить этот параметр с помощью NDK, например. как позвонить ulimit
? Может ли madvise помочь мне немного здесь?
Обновление
Смотрите мой ответ здесь для инструмента mmap, который можно использовать в Java