Я работаю над веб-приложением Java, которое использует тысячи небольших файлов для создания артефактов в ответ на запросы. Я думаю, что наша система могла бы видеть улучшения производительности, если бы мы могли сопоставлять эти файлы в памяти, а не работать по всему диску, чтобы находить их все время.кэширование tar внутри jvm для более быстрого ввода/вывода файлов?
Я слышал о mmap в linux, и мое основное понимание этой концепции состоит в том, что когда файл читается с диска, содержимое файла кэшируется где-то в памяти для более быстрого последующего доступа. То, что я имею в виду, похоже на эту идею, за исключением того, что я хотел бы прочитать весь массив файлов с возможностью mmap в память, поскольку мое веб-приложение инициализируется для минимальных ответов времени запроса.
Один из аспектов моего приезда-мысли состоит в том, что мы, скорее всего, будем загружать файлы в jvm-память быстрее, если бы все они были смоделированы и как-то смонтированы в JVM как виртуальная файловая система. В его нынешнем виде может потребоваться несколько минут для нашей текущей реализации, чтобы пройти через набор исходных файлов и просто выяснить, что все на диске. Это потому, что мы по существу делаем статистику файла для более чем 300 000 файлов.
Я нашел проект Apache VFS, который может читать информацию из tar-файла, но я не уверен в их документации, если вы можете указать что-то вроде «также, прочитайте весь tar в память и держите его там. . ".
Мы говорим о многопоточной среде, в которой используются артефакты, которые обычно объединяют около 100 различных файлов из полного набора 300 000+ исходных файлов, чтобы сделать один ответ. Так что независимо от решения виртуальной файловой системы, он должен быть потокобезопасным и эффективным. Мы говорим только о чтении файлов здесь, не пишет.
Кроме того, мы работаем с 64-разрядной ОС с 32 гигабайтами оперативной памяти, наши 300 000 файлов занимают около 1,5 до 2,5 гигабайт пространства. Мы можем с уверенностью читать 2,5-гигабайтный файл в памяти намного быстрее, чем 300K небольших файлов размером в несколько килобайт.
Спасибо за ввод!
- Джейсон
Также узел, в котором mmap() не нажимает содержимое в памяти, он дает вам адрес виртуальной памяти, где вы можете получить контент. В первый раз файл будет извлечен с диска. (Тогда его можно оставить в памяти, если его достаточно.) – mat 2008-12-10 08:56:33