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