2016-03-02 123 views
1

我注意到,在Java中第一次初始化RandomAccessFile對象要比後續初始化RandomAccessFile對象到磁盤上的同一文件要慢。有沒有一些背景緩存,操作系統可以做到這一點?第一次RandomAccessFile初始化速度慢,後來快速

案例:我從磁盤加載圖像並允許用戶翻閱它們。我希望瓶頸是圖像的顯示,但在第一次加載時,瓶頸是加載圖像(使用JProfiler發現瓶頸;每次調用RandomAccessFile<Init>〜8ms)。如果我翻閱了我已經查看過的圖像,對RandomAccessFile<Init>的調用只有幾微秒。

有沒有人見過這樣的事情?有沒有解決方法?數據集可能包含100,000個圖像,因此初始化一組虛擬對象可能不可行。

的初始化代碼行很簡單:

RandomAccessFile fileIn = new RandomAccessFile(abspath, "r");

+2

是的,操作系統緩存。 – Andreas

+0

@Andreas謝謝!只是要了解,它是什麼緩存,有沒有辦法解決這個問題?也許使用'RandomAccessFile'以外的東西會做到這一點,或者這是I/O的一般問題? – ddukki

+1

如果繞過緩存,後續打開的文件將會像第一個文件一樣慢,那麼爲什麼要這麼做呢?第一次打開文件時,緩存速度並不會降低,因爲無需等待慢速硬盤讀取數據,它可以提高重新打開文件的性能。 – Andreas

回答

3

是,操作系統緩存。

如果繞過操作系統緩存,後續打開的文件將會像第一個緩慢打開,那麼爲什麼要這麼做?

緩存在第一次打開文件時速度不會降低,它不需要等待慢速硬盤讀取數據就可以提高重新打開文件的性能。

相關問題