2011-11-19 135 views
0

(這不是我的計劃,但我會盡力提供所有相關資料給我所知)。文件讀取第一讀取慢,但很快就連續讀

有一個程序它讀取大小約爲300MB的二進制文件,處理它們並輸出一些信息。該程序使用ifstream進行文件輸入,並且每次讀取都正確初始化並關閉流。

程序必須多次讀取每個文件。第一次讀取文件大約需要3秒,每次連續讀取大約需要0.1秒。如果處理了多個文件,返回到第一個文件仍然會產生較快的讀取速度,但是在一段時間後重新讀取文件變得緩慢。

此外,如果一個文件被複制到另一位置,該新文件的第一讀取的速度大致是0.1秒。

如果你做數學題,連續讀取速度大約是硬盤驅動器的通告讀取速度。

這一切看起來像文件位置由兩種操作系統或硬盤的緩存,這樣在連續讀取你不必去尋找文件的位置。

有誰知道到底是什麼原因造成初始讀取速度下降,並且是否可以預防?三秒可能看起來不是很多,但它們會使正確處理每個文件所需的總時間增加大約5個小時。

此外,該程序運行在Fedora 14和Scientific Linux上,兩個操作系統都有其默認文件系統。

任何想法,將不勝感激。

+0

讀取300MB文件的3秒鐘大概是正確點擊磁盤 - 這是100MB/s,這是速度的高端,您可以從現代快速硬盤。讀取300MB文件的0.1秒不會從磁盤上脫落 - 這是從緩存中提取出來的。 – caf

回答

2

Linux會嘗試將文件複製到RAM,使下一次讀取速度更快 - 我猜這是發生了什麼。初讀是實際關閉磁盤 - 隨後的讀取出文件緩存的,因爲整個文件已經被複制到RAM

+0

當程序迭代文件時,我監視RAM。考慮到可用空間的原始數量,文件的大小以及它在舊的「被遺忘」之前迭代的文件數量,這似乎是正確的答案。 – Morglor

+0

計算機似乎並不這樣做:-)去閱讀Linux緩存文檔 –

1

操作系統(Linux)具有磁盤緩存。讀完文件後,它就在緩存中。

0

我的猜測是,也許是第一次讀它需要較長時間的文件,因爲它加載的一些信息進入緩存?

第一次之後,它只是使用緩存中的一些信息。

0

是的,數據變得緩存。你可以用系統調用強制緩存(或者簡單地讓另一個進程讀取它)。如果使用的是mmap,您也可以使用madvise