Выкл. Хранилище загруженных больших файлов в куче

У меня есть несколько огромных файлов (около 10-12 файлов по 1-2 Гб каждый), которые нужно скачивать каждый час. Я храню их как Hashmap, где ключ — это версия файла, а значение — это содержимое файла в списке строк. Проблема, с которой мы сталкиваемся, заключается в том, что каждый час при загрузке новых файлов срабатывает сборщик мусора и очищает старые файлы, что вызывает длительные паузы для системы, так как файлы огромны. Я думаю о решении, в котором мы можем хранить это содержимое файлов вне кучи. Для этого мы исследовали карту хроник.

Вопрос 1. Использует ли ОС во время загрузки какие-либо буферы в динамической памяти или структуры данных? Если да, то не имеет значения, храню ли я файл вне кучи, поскольку память в куче уже выделена. Есть ли способ загружать и хранить файлы вне кучи, вообще не используя память в куче для хранения файла?

Вопрос 2: есть ли способ хранить файлы вне кучи и просто сохранять ссылку на эту память как значение в моей хэш-карте, избегая, таким образом, использования какой-либо специальной структуры данных, такой как карта хроники.


person Sarthak Agarwal    schedule 23.03.2021    source источник
comment
Иногда это помогает дать больше контекста ... Вы действительно используете файлы / вы думали о том, чтобы вместо этого загрузить их в файл? Если вы пытаетесь обнаружить изменения, возможно, есть другие способы (сохранить MD5 на карте)? 1-2 ГБ x 10-12 кажется огромным объемом оперативной памяти, которую нужно выделить для чего??   -  person Mr R    schedule 23.03.2021
comment
У нас нет возможности загружать их в файл. Мы должны прочитать список строк, но здесь мы готовы пожертвовать задержкой. Мы просто хотим избежать дополнительных пауз GC. Цифры, которые я предоставил, являются худшими номерами. Обычно размеры файлов составляют около 300 МБ, и мы можем захотеть загрузить 4-6 файлов.   -  person Sarthak Agarwal    schedule 23.03.2021
comment
Итак, @Sarthak Agarwal, вы имеете в виду перечитывать снова и снова или обрабатывать один раз? Первое может оправдать перенос в память, второе — это сохранение во временный файл и обработка из временного файла. Также можно отфильтровать данные/выполнить некоторую предварительную обработку перед использованием. После сохранения в виде файлов вы можете рассмотреть MemoryMappedIO (stackoverflow.com /questions/22153377/), где большая часть файла может быть отображена в память (как байтовое ведро), а не в кучу, и это окно в файл легко перемещается (но все же относительно высокая производительность ).   -  person Mr R    schedule 23.03.2021
comment
Будет ли возможна обработка ввода при загрузке? Тогда данные должны быть только буферизованы (например, с помощью BufferedReader) и не полностью сохранены в памяти. Если между файлами существуют зависимости обработки, вы можете уменьшить набор данных, извлекая только необходимые биты и продолжая обработку после того, как все файлы будут загружены (и предварительно обработаны).   -  person horstr    schedule 03.04.2021