2012-11-07 68 views
10

在我的web服務中,我打開文件流到本地磁盤上的文件。我保持這種服務的一生。對於每個查詢,我使用文件流來讀取磁盤。 我這樣做是爲了避免在每個查詢中重新打開文件流。這條路徑的延遲很關鍵(應少於幾毫秒)。我使用SSD來將磁盤IO時間保持在0.1ms或更短。長時間保持C#文件流打開是否安全?

文件流可以在很長一段時間(天)內變壞(無效)。在每個查詢中重新打開文件流是否安全?如果我必須重新打開,每秒不斷重新打開文件流的開銷是多少?

+2

如果您擔心延遲問題,是否有原因導致您沒有在靜態內存中加載文件內容?我認爲這個問題應該是你應該用什麼樣的模式來快速訪問內容。 – AdamV

+2

該文件太大而不適合內存。我有一個索引,可以讓我直接找到正確的偏移量並從那裏讀取。它不應該超過1 IO。讀取的數據量很小。 – user201511

+0

您是否編寫過測試工具以嘗試打開單個文件流而不打開和關閉。我建議你試着寫一個測試,並比較結果。 – AdamV

回答

6

只要你需要保持文件打開是安全的。

它是否適合您的情況 - 您需要自己決定。重新打開文件不應該很慢(即使在常規驅動器上),但是您需要嘗試測量自己的身份,但您知道確切的性能目標。

+0

選擇這個作爲答案,即使另一個給出了很好的建議,因爲這是我的問題的唯一直接答案。 – user201511

4

我會讓文件打開的唯一問題是,如果應用程序因任何原因失敗,並且無法從其當前位置恢復以關閉流;在KERNEL32CreateFile切入點,它是用來打開文件作出如下聲明:

當應用程序使用完對象通過的CreateFile返回的句柄,使用CloseHandle函數關閉句柄。這不僅可以釋放系統資源,還可以對共享文件或設備以及將數據提交到磁盤等事情產生更廣泛的影響。在適當的時候,在這個主題中有具體細節。

所以我認爲這是更合適的每一次打開和關閉FileStream

+0

我同意,將文件留待長時間閱讀似乎是一種風險,違背了開放,閱讀和關閉資源的最佳做法。 – AdamV

+0

謝謝,它聽起來像是正確的做法是每次重新打開。 – user201511

+0

@ user201511,請記住將其標記爲我自己和社區其他人的答案。 –

相關問題