我支持使用平面文件(纯文本)进行持久性的遗留 Java 应用程序。由于应用程序的性质,这些文件的大小可以达到每天 100s MB,而应用程序性能的限制因素通常是文件 IO。目前,应用程序使用普通的 java.io.FileOutputStream 将数据写入磁盘。
最近,我们有几位开发人员断言,使用内存映射文件、以本机代码 (C/C++) 实现并通过 JNI 访问,将提供更高的性能。但是,FileOutputStream 已经将本机方法用于其核心方法(即 write(byte[])),因此在没有硬数据或至少没有轶事证据的情况下,这似乎是一个脆弱的假设。
我对此有几个问题:
这个说法真的是真的吗? 与 Java 的 FileOutputStream 相比,内存映射文件是否总是提供更快的 IO?
从 FileChannel 访问的 MappedByteBuffer 类是否提供与通过 JNI 访问的本机内存映射文件库相同的功能?MappedByteBuffer 缺少什么可能导致您使用 JNI 解决方案?
在生产应用程序中使用内存映射文件进行磁盘 IO 有哪些风险?也就是说,具有持续正常运行时间且重启次数最少的应用程序(最多每月一次)。来自生产应用程序(Java 或其他)的真实轶事优先。
问题 #3 很重要——我可以通过编写一个“玩具”应用程序来部分回答这个问题,该应用程序使用上述各种选项对 IO 进行性能测试,但是通过发布到 SO,我希望能够了解真实世界的轶事/数据.
[编辑] 澄清 - 每天运行,应用程序创建多个文件,大小范围从 100MB 到 1 gig。总的来说,该应用程序可能每天要写出多个演出数据。