我支持一个遗留的Java应用程序,该应用程序使用纯文本的平面文件进行持久化。由于应用程序的性质,这些文件的大小每天可以达到数百MB,并且通常情况下限制应用程序性能的因素是文件IO。当前,该应用程序使用普通的java.io.FileOutputStream将数据写入磁盘。
最近,我们有几位开发人员声称,使用内存映射文件(由C/C++实现并通过JNI访问)将提供更高的性能。但是,FileOutputStream已经使用本地方法来执行其核心方法(即write(byte [])),因此在没有硬数据或至少有经验的证据的情况下,这似乎是一个脆弱的假设。
我有几个问题:
1. 这个说法真的正确吗?内存映射文件是否始终比Java的FileOutputStream提供更快的IO? 2. 通过FileChannel访问的MappedByteBuffer类是否提供与通过JNI访问的本地内存映射文件库相同的功能? MappedByteBuffer缺少什么可能导致您使用JNI解决方案? 3. 在生产应用程序中使用内存映射文件进行磁盘IO的风险是什么?也就是说,具有连续运行时间和最少重新启动(最多一个月)的应用程序。首选来自生产应用程序(Java或其他)的实际经验故事。
第三个问题很重要-我可以通过编写一个“玩具”应用程序来部分回答这个问题,该应用程序使用上述各种选项进行性能测试,但是通过发布到SO,我希望有真实的经验/数据可供参考。
【编辑】澄清 - 每天运行期间,应用程序创建多个文件,大小从100MB到1GB不等。总体而言,应用程序可能每天会写入多个GB的数据。
最近,我们有几位开发人员声称,使用内存映射文件(由C/C++实现并通过JNI访问)将提供更高的性能。但是,FileOutputStream已经使用本地方法来执行其核心方法(即write(byte [])),因此在没有硬数据或至少有经验的证据的情况下,这似乎是一个脆弱的假设。
我有几个问题:
1. 这个说法真的正确吗?内存映射文件是否始终比Java的FileOutputStream提供更快的IO? 2. 通过FileChannel访问的MappedByteBuffer类是否提供与通过JNI访问的本地内存映射文件库相同的功能? MappedByteBuffer缺少什么可能导致您使用JNI解决方案? 3. 在生产应用程序中使用内存映射文件进行磁盘IO的风险是什么?也就是说,具有连续运行时间和最少重新启动(最多一个月)的应用程序。首选来自生产应用程序(Java或其他)的实际经验故事。
第三个问题很重要-我可以通过编写一个“玩具”应用程序来部分回答这个问题,该应用程序使用上述各种选项进行性能测试,但是通过发布到SO,我希望有真实的经验/数据可供参考。
【编辑】澄清 - 每天运行期间,应用程序创建多个文件,大小从100MB到1GB不等。总体而言,应用程序可能每天会写入多个GB的数据。