首先 RandomAccessFile 初始化缓慢,随后快速
First RandomAccessFile initialization slow, subsequently fast
我注意到 Java 中的 RandomAccessFile
对象的第一次初始化比磁盘上同一文件的 RandomAccessFile
对象的后续初始化要慢得多。 OS 是否有一些后台缓存来实现这一点?
恰当的例子:我正在从磁盘加载图像并允许用户翻阅它们。我希望瓶颈是图像的显示,但在第一次加载时,瓶颈是图像的加载(瓶颈是使用 JProfiler 发现的;RandomAccessFile<Init>
~8ms per call)。如果我翻回我已经看过的图像,对 RandomAccessFile<Init>
的调用只有几微秒。
有人见过这样的东西吗?有什么解决方法吗?一个数据集可能包含 100,000 张图像,因此初始化一堆虚拟 RandomAcessFile
对象可能不可行。
初始化的代码行很简单:
RandomAccessFile fileIn = new RandomAccessFile(abspath, "r");
是的,OS 缓存。
如果绕过 OS 缓存,后续打开文件的速度将与第一个文件一样慢,那你为什么要这样?
第一次打开文件时缓存并没有减慢速度,它提高了重新打开文件的性能,无需等待慢速硬盘驱动器读取数据。
我注意到 Java 中的 RandomAccessFile
对象的第一次初始化比磁盘上同一文件的 RandomAccessFile
对象的后续初始化要慢得多。 OS 是否有一些后台缓存来实现这一点?
恰当的例子:我正在从磁盘加载图像并允许用户翻阅它们。我希望瓶颈是图像的显示,但在第一次加载时,瓶颈是图像的加载(瓶颈是使用 JProfiler 发现的;RandomAccessFile<Init>
~8ms per call)。如果我翻回我已经看过的图像,对 RandomAccessFile<Init>
的调用只有几微秒。
有人见过这样的东西吗?有什么解决方法吗?一个数据集可能包含 100,000 张图像,因此初始化一堆虚拟 RandomAcessFile
对象可能不可行。
初始化的代码行很简单:
RandomAccessFile fileIn = new RandomAccessFile(abspath, "r");
是的,OS 缓存。
如果绕过 OS 缓存,后续打开文件的速度将与第一个文件一样慢,那你为什么要这样?
第一次打开文件时缓存并没有减慢速度,它提高了重新打开文件的性能,无需等待慢速硬盘驱动器读取数据。