背景:
我有一个Java应用程序,在大型内存映射文件(>500MB)上进行密集的IO操作。该程序读取数据,写入数据,有时同时进行读写操作。
所有读/写功能具有类似的计算复杂度。
我对程序的IO层进行了基准测试,并注意到了内存映射文件的奇怪性能特征:
- 每秒执行90k次读取操作(在随机位置每次读取1KB)
- 每秒执行38k次写入操作(按顺序每次写入1KB)
- 每秒执行43k次写入操作(在随机位置每次写入4字节)
- 每秒仅执行9k次读/写组合操作(每次在随机位置读取12字节,然后写入1KB)
使用64位JDK 1.7,Linux 3.4。
计算机是一台普通的Intel PC,具有8个线程的CPU和4GB物理内存。进行基准测试时,只分配了1 GB的JVM堆。
如果需要更多细节,请查看基准测试代码:https://github.com/HouzuoGuo/Aurinko2/blob/master/src/test/scala/storage/Benchmark.scala
这里是上述读取、写入、读写功能的实现:https://github.com/HouzuoGuo/Aurinko2/blob/master/src/main/scala/aurinko2/storage/Collection.scala
所以我的问题是:
- 给定固定的文件大小和内存大小,哪些因素会影响内存映射文件的随机读取性能?
谢谢。