2014-11-22 59 views
0

在整個論壇中找不到對此Q的答案。 有沒有辦法讀取例如5個txt文件而不是一個? 我想訪問磁盤更少的時間。在一次訪問硬盤時讀取幾個txt文件

+0

謝謝,以爲有沒有辦法做到這一點,只是想確定:)如果你使用C#4或以上版本,速度爲什麼你不使用並行類來同時讀取文件, – UserED 2014-11-22 08:24:22

+0

? – 2014-11-22 10:35:24

回答

0

只讀了五個文件。在你的程序發佈的I/O與磁盤上發生的事情之間存在任何直接的因果關係的時代早已過去。緩存(是的,複數),命令排隊,預測性提取和其他策略都意味着你可以爲性能做的最好的事情就是告訴操作系統你想要什麼,並讓它找出實現它的最佳方式。

(不,這是不可能做到正是你想要的東西反正)

0

不可能...閱讀文件一個又一個......不要在這種情況下的表現你的生活複雜化的思維.. :-)

好運...

0

根據您想要的文件做什麼,你既可以使用5行代碼readall線。

或者你打開一個streamreader並在for循環中進行閱讀,所以你可以在同一行上閱讀它們。 這不會是「立即一次」,而是非常接近。

最後一個選項是真正使用多線程,您可以讀取所有文件的異步並在不同的線程上讀取所有文件。

但請記住,如果從同一個存儲中讀取,它不會給你任何額外的表現! 如果您在其他存儲設備上讀取數據,或者在使用RAID的存儲設備上讀取數據,並且您讀取的文件足夠大,以便有足夠的讀取時間以便甚至感受到性能增益,那麼您只會獲得性能提升。

0

由於垃圾收集的開銷,從文本文件讀取字符串時,光盤訪問很可能不是您主要關心的問題。 請參閱How to parse a text file in C# and be io bound?

如果您想用讀取請求最大化您的光盤,您應該更專注於重用緩衝區和避免字符串。此外,您可以並行發出讀取請求,希望RAID控制器讀取的光盤隊列得到優化,以便將來自不同文件的隨機讀取轉換爲大量順序讀取(例如,本地命令隊列就是這樣一個功能)。爲了使這種優化發生,你需要並行排隊足夠的讀取請求(但不是太多)以最大限度地發揮RAID控制器的作用。

實際上,如果您讀取一次或多次讀取文件,這很重要,因爲大部分時間從文件系統緩存傳遞所有後續讀取,這基本上是一個CopyMemory操作。

如果您希望獲得更快的速度,您應該查看內存映射文件,其中文件系統緩存的實際內容映射到您的進程空間,從而將內存複製操作從內核拷貝到用戶模式緩衝區。

第一條規則應該是在優化之前進行測量。否則,你將花費大量的時間和精力在根本不成問題的地方。