2015-05-19 79 views
1

我試着讓應用程序讀取文件。文件可能大於2GB,因此我無法將它們完全加載到內存中。由於這種我正在文件讀取系統上的WinRT允許我:與局部緩衝器如何使用IRandomAccessStream和DataReader?

  1. 讀取文件 - 負載到存儲器件的尺寸5MB 例如,那麼如果字節的所需量在 存在用戶檢查緩衝。
  2. 給我多線程訪問文件 - 例如我需要讀取2個斷開連接目的的文件。
  3. 生成的系統必須使用盡可能少的cpu,內存和硬盤時間。

現在我設計的東西,在1線與緩衝區中讀取文件,我有一些問題:

  1. DataReader->LoadAsync(N)DataReader->ReadBytes(target_array)之間會發生什麼?第一個操作是將數據加載到內存中,然後將數據放入目標中?
  2. DataReader(或IRandomAccessStream,我不知道究竟是哪一個)在交換文件中存儲加載的數據(用ssd驅動器捕獲它:交換放置在hdd上,第二次嘗試讀取相同的數據顯示像hdd一樣的速度)。如何避免它?
  3. 我的閱讀系統設計(file->buffer->user)適合DataReaderIRandomAccessStream
+2

@Yakk FYI,WinRT暗示它是C++/CX,而不是C++/CLI –

+1

@LucasTrzesniewski啊,又一種方言?對不起,misedit。 – Yakk

+0

@Yakk不用擔心,是的,他們又提出了另一種方言(不在CLI上運行,沒有GC,因此'gcnew'關鍵字不適合,等等),但它幾乎是相同的語法:-) –

回答

0

偉大的問題,你在正確的軌道上。

  1. 是,DataReader->LoadAsync(uint count)似乎將數據從源(磁盤,網絡,存儲器)複製並將其加載到讀者的中間緩衝器。請確保您等待返回的DataReaderLoadOperation完成,然後再從DataReader開始讀取,否則您將遇到一些難以調試的異常。

  2. DataReader簡單地提供圍繞IRandomAcessStream/IInputStreamReadAsync方法的包裝。文件是否被交換取決於執行IRandomAcessStream。 Windows似乎默認緩存文件。 You can read more about Window's file caching mechanism here.我看着StorageFile,找不到禁用緩存的方法,但有一種方法可以通過Win32 API的CreateFile來實現。

  3. 這種設計很好;只要您計劃按順序讀取文件,無需查找,效果最佳。當附加到DataReader的流被搜索到時,DataReader繼續在其當前內部位置處讀取。它只會再次調用LoadAsync。爲了在多個線程中使用,可以調用IRandomAccessStream.GetInputStreamAt在指定位置創建輸入流的副本,並將DataReader綁定到該位置。使用這種可怕的記錄API

好運。