我有一個算法,執行一些文件I/O(讀,寫)和計算。如何從磁帶獲得良好的讀取性能?
如果我寫入磁帶(不讀取),該算法效果很好。如果我從磁帶上讀(不寫),表現很差。如果磁帶不在等式中(只是I/O的磁盤),那麼它就很好。
現在,我把它歸結爲一個我試圖理解的相對簡單的案例。
該設置是磁帶上的一個20 GB文件。我正在按順序讀取該文件。
測試算法是這樣的:
while (fileRemaining)
{
ReadBlock(blockSize);
Sleep(sleepTime); // this is to mimic computation time
}
一些觀察:
- 當使用8K的塊大小,和0休眠時間,吞吐量(數據讀/秒)是好的。此外,磁帶機不斷髮出噪音。
- 當使用8K的blockSize和任何非零的sleepTime(甚至1ms)時,吞吐量會受到嚴重影響。數據仍然被讀取,但磁帶驅動器不會定期發出噪音。偶爾會有噪音,它變得沉默了一會兒。
- 當使用blockSize爲2M,睡眠時間爲100ms時,吞吐量很好。磁帶機在整個過程中都會產生噪音(儘管它聽起來像是一種較慢的速度?)。
- Windows資源管理器能夠以良好的吞吐量將文件從磁帶傳輸到磁盤。
如何在這裏獲得良好的閱讀效果?
如果你願意幫助我理解其他的祕密 - 爲什麼睡眠的存在會如此顯着地降低吞吐量(知道這有助於重新考慮算法)?一次從磁帶讀取的「最佳」數量是多少?磁帶機發出的噪音是否與通知有關?
您可以讀取塊,以便最大限度地減少RAM中存儲的數據量。你不必使用這麼小的塊大小。 – Blender 2012-04-25 00:28:46
磁帶機的讀取速度是多少?如果是80MB/s,那麼讀取8KB需要0.1ms(假設沒有尋道開銷)。很明顯,相應的1ms睡眠會大大減慢速度。 – 2012-04-25 00:31:00
@OliCharlesworth對不起,我早先排除了數字。我相信它大約是80 MB/s(這是我觀察到的最好結果)。你的分析是正確的,我們應該預計會有一個大幅度的放緩。從現在開始,讀取8KB需要1.1ms,這意味着大約7.1MB /秒。然而,實際上讀數低於150 KB /秒 – jglouie 2012-04-25 13:16:41