Я думаю, что вы все еще думаете о старом режиме памяти / диска.
mmap
здесь не поможет, потому что эта старая память / диск давно исчезла. Если вы отобразите файл, ядро вернет вам указатель на некоторую виртуальную память , которую вы сможете использовать по своему усмотрению, не загрузит файл в real Память сразу, он сделает это, когда вы запросите часть файла, и загрузит только те страницы, которые вы запрашиваете. (То есть страница памяти, обычно размером около 4 КБ.)
Вы говорите, что эти файлы размером 300 КБ занимают от 1,5 до 2,5 ГБ дискового пространства. Если есть вероятность, что вы можете добавить на сервер 2 (или лучше, 4) гигабайта ОЗУ, вы бы очень лучше оставили бы эту функцию чтения с диска ОС, если у нее достаточно ОЗУ для загрузки файлы в некотором дисковом кеше, он будет, и из них любой read () на них даже не попадет на диск. (Будет сохранено время в inode, если вы не смонтировали том с noatime.)
Если вы попытаетесь прочитать () файлы, поместить их в память и отслужить их оттуда, теперь у вас есть возможность точно знать, что они всегда будут в RAM , а не в свопе потому что ОС была связана с той частью памяти, которую вы не использовали в течение некоторого времени.
Если у вас достаточно ОЗУ, чтобы ОС могла выполнять кэширование на диске, и вы действительно хотите, чтобы файлы загружались, вы всегда можете выполнить небольшой скрипт / программу, которая пройдет через вашу иерархию и прочитает все файлы. (Ничего не делая.) Операционная система загрузит их с диска в кэш-память, но вы не сможете узнать, останутся ли они там, если ОС потребуется память. Поэтому, как я уже говорил, вы должны позволить ОС справиться с этим и выделить для этого достаточно оперативной памяти.
Вы должны прочитать Лак Заметки архитектора , где phk говорит вам своими словами, почему то, чего вы пытаетесь достичь, намного лучше осталось от ОС, которая всегда будет лучше знать JVM, что находится в оперативной памяти, а что нет.