我需要從3.7 GB文件讀取小數據序列。我需要讀取的位置是不是相鄰的,但我可以對IO進行排序,以便從頭到尾讀取文件。如何利用磁盤IO排隊
該文件存儲在應能夠處理/優化排隊IO的iSCSI SAN上。
問題是,如何一次性完成我需要的所有數據/職位的一次性請求?可能嗎?我不認爲異步IO是一種選擇,因爲閱讀是非常小的(20-200字節)
目前的代碼如下所示:
using (var fileStream = new FileStream(dataStorePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
for (int i = 0; i < internalIds.Count();i++)
{
fileStream.Position = seekPositions[i].SeekPosition;
... = Serializer.DeserializeWithLengthPrefix<...>(fileStream, PrefixStyle.Base128);
}
...
}
我在尋找各種方法來改善這個我/ O,因爲我的表現有所降低。移動頭部的所有尋求時間似乎都在增加。
+1瞭解問題。我相信這就是發生了什麼,在第二次讀取需要完成時,磁盤已經旋轉,因此我正在尋找一種方法來執行硬件排隊。 – andreialecu 2009-08-21 08:11:09
我原以爲Windows會爲你處理硬件排隊。 C#基礎上的硬盤肯定無法獲得中世紀的成就。你只能說「去這裏讀X字節」。我將嘗試使用多個線程的不同訪問模式。如果2個線程讀取A和B,然後讀取C和D,也許會更快;或者可能是A和M,然後是B和N. – 2009-08-25 02:54:36
ReadFileScatter API聽起來很有前途。我的答案中添加了一個blurb。 – 2009-09-16 19:38:41