我有一个只读取12GB文件的java程序
Reader reader1 = new FileReader(filePath);
try (BufferedReader bufferedReader = new BufferedReader(reader1)) {
String line = bufferedReader.readLine();
while (line != null) {
line = bufferedReader.readLine();
}
}
第一次阅读文件大约需要53秒。
然后我使用RAMMAP检查文件是否被缓存,文件是完全缓存的,并且它处于待机列表中。
我再次运行上述程序,这次耗时约53秒。为什么即使在OS缓冲区缓存完成文件时性能也没有提高。
我还创建了一个RAM DISK,将输入文件复制到RAM DISK中,然后再次运行上面的代码,即使现在花了大约54秒。当RAM IOPS快得多时,为什么它没有反映在这里
答案 0 :(得分:1)
12GB即12,000,000,000字节的数据。假设文件中的一行平均为100字节,即120,000,000行。这意味着你的循环有1.2亿次迭代。 53秒看起来不错不是吗?
有1.2亿个线路实例需要进行垃圾回收。有大约1.2亿个readline和1.2亿个memcpys。 53秒看起来很公平,这看起来像一些不完全IO限制的代码。
BufferedReader很慢。真的很慢。请参阅此答案:Why is the performance of BufferedReader so much worse than BufferedInputStream?
答案 1 :(得分:1)
预取。
您按顺序阅读文件。您的磁盘速度足以提供12GB / 53s = 226 MB / s。在阅读完部分内容后,操作系统假设您需要越来越多,并将下一个卡盘读入内存,以便在需要时可以使用。
速度是所需CPU和所需IO时间的最大值。 CPU需要53秒,磁盘不慢。你的任务是CPU限制的。
当RAM IOPS快得多时,为什么它没有反映在这里。
从随机位置或许多文件中读取12GB,您将看到磁盘速度有多慢。在您的情况下,持续时间计算为最大值max(53, 1) == max(53, 53)
。