Я поддерживаю устаревшее Java-приложение, которое использует плоские файлы (обычный текст) для сохранения. Из-за характера приложения размер этих файлов может достигать 100 МБ в день, и часто ограничивающим фактором в производительности приложения является файл IO. В настоящее время приложение использует простой ol 'java.io.FileOutputStream для записи данных на диск.
Недавно у нас было несколько разработчиков утверждать, что использование файлов с отображением памяти, реализованных в собственном коде (C/С++) и доступ через JNI, обеспечит большую производительность. Тем не менее, FileOutputStream уже использует собственные методы для своих основных методов (т.е. Write (byte [])), поэтому он представляет собой незначительное предположение без жестких данных или, по крайней мере, для некоторых доказательств.
У меня есть несколько вопросов по этому поводу:
-
Действительно ли это утверждение верно? Будут ли файлы с отображением памяти всегда обеспечить более быстрый IO по сравнению с Java FileOutputStream?
-
Является ли класс MappedByteBuffer доступ к файлам FileChannel та же функциональность, что и родная доступная библиотека с отображением памяти через JNI? Что такое MappedByteBuffer это может привести к использованию Решение JNI?
-
Каковы риски использования файлы с отображением памяти для дискового ввода-вывода в процессе производства выражение? То есть приложения которые имеют непрерывный минимальная перезагрузка (раз в месяц, макс.). Реальные анекдоты от производства приложений (Java или иначе) предпочтительным.
Вопрос №3 важен - я мог бы частично ответить на этот вопрос, написав приложение "игрушка", в котором перформанс IO использует различные варианты, описанные выше, но путем публикации в SO Я надеюсь на реальные анекдоты/данные пережевывать.
[EDIT] Уточнение - каждый день работы приложение создает несколько файлов размером от 100 МБ до 1 гигабайта. В общей сложности приложение может записывать несколько концертов в день.