懶惰的評估對於像處理大文件這樣的東西來說非常有用,因爲這些文件一次不會放在主內存中。但是,假設序列中有一些元素需要立即進行評估,而其餘元素可以進行延遲計算 - 有什麼方法可以指定?如何評估一個懶惰序列的一部分?
具體問題:(萬一,有助於回答這個問題)
具體來說,我使用了一系列IEnumerables的迭代器爲多個序列 - 這些序列使用BinaryReader在流從文件中讀取數據打開(每個序列負責從其中一個文件讀入數據)。這些MoveNext()將以特定的順序被調用。例如。 iter0
然後iter1
然後iter5
然後iter3
....等等。此訂單在另一個序列中指定index
= {0,1,5,3,....}
。然而,序列是懶惰的,評估自然只在需要的時候完成。因此,當序列的IEnumerables正在移動時,文件讀取(對於開始時從磁盤上的文件讀取的序列)。這導致非法文件訪問 - 一個進程正在讀取的文件被再次訪問(根據錯誤消息)。
確實,非法文件訪問可能是出於其他原因,並且在嘗試盡我所能調試其他原因之後,部分懶惰的評估可能值得嘗試。
如果您只是從文件中讀取數據,那麼在同時讀取文件的多個流中應該沒有問題。你試着使用一些緩存機制(急切地評估序列的一部分),但不應該有這種需要,因爲文件系統總是使用緩衝區。 –
你是如何打開文件的?您可能需要使用['FileShare.Read'](http://msdn.microsoft.com/en-us/library/System.IO.FileShare.aspx)。 – Daniel
'|> Seq.cache' ...? –