2016-12-14 24 views
0

當我必須從在C++程序大(2GB)二進制文件中讀取的二進制數據轉換成char陣列。第一次從我的SSD讀取文件時,每個文件讀取大約需要6.4秒。但是,當再次運行相同的代碼時,或者甚至在運行一個不同的虛擬程序之後,下一個讀數每個文件只需要大約1.4秒。 Windows任務管理器甚至在第二,第三,第四...次運行中顯示出更少的磁盤活動。所以,我的猜測是Window的文件緩存讓我無法再等待SSD中的數據,因爲再次填充陣列時。極限性能差,讀取相同的文件的第二時間以C

有沒有乾淨的選項將文件讀入文件緩存的客戶運行該軟件之前?任何更好的選擇,而不是已經提前用fread加載文件?我怎麼能確定,數據一直保存在文件緩存中,直到我需要它爲止?

還是我完全錯了我的文件緩存假設?對於這些不同的加載時間是否有另一個(更好的)解釋?

回答

1

猜測這裏: 你最有可能是對你的文件緩存的假設。

你可以預先加載文件的用戶運行該軟件之前? 不是直接。你的程序應該如何知道它將在未來幾分鐘內運行?

所以你可能需要一個輔助機制或技巧。 我在這裏看到的選項是:

  • 索引機制可提供更快,更好的目標訪問您的數據。如果您只需要一次從這些數據中獲取小塊信息,這將非常有用。
  • 嘗試並行處理數據的加載,所以即使它並沒有真正得到更快,用戶擁有它,因爲他可以開始他的數據已經工作的印象,而其餘的是在後臺獲取。
  • 有一個輔助工具可以在操作系統中啓動並預取所有內容,因此您可以在需要時將其保存在內存中。 注意:由於您從一開始就爲您的工具預留了一大塊內存,甚至是SSD緩存(取決於實施情況),這具有嚴重的影響。只有在替代方案是啓示時才考慮這樣做......

您也可以嘗試合併前兩個選項。提高數據可用性的關鍵是找出以什麼順序閱讀的內容,而不是一次性全部加載所有內容。 Divide and Conquer.

沒有對這個問題的詳細信息是不可能的,雖然提供更具體的解決方案。

+0

非常感謝您的幫助! 我們的想法很相似。但是https://msdn.microsoft.com/de-de/library/windows/desktop/aa364218(v=vs.85).aspx聲稱設置標誌FILE_FLAG_NO_BUFFERING會禁用文件緩存。但是當使用HANDLE hFile = CreateFileW(wFilename.c_str(),GENERIC_READ,0,0,OPEN_EXISTING,\t FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED,\t 0); 時間行爲(首次加載速度慢,後續加載速度加快5倍)仍然保持不變!?!?這怎麼符合我們的文件緩存假設?感謝您的任何想法, Jürgen – juergen861

+0

可能是古怪的操作系統行爲,一個微妙的執行錯誤,您的代碼的其他部分干擾或其他正在運行的應用程序干擾。另外:請記住,硬盤和固態硬盤可能(通常是)具有超出操作系統控制的內部緩衝區。 –