簡體   English   中英

快速讀取大量文件

[英]Reading a large number of files quickly

我有大量(> 100k)相對較小的文件(1kb - 300kb),我需要讀入和處理。 我正在循環遍歷所有文件並使用File.ReadAllText讀取內容,處理它,然后讀取下一個文件。 這很慢,我想知道是否有一種很好的方法來優化它。

我已經嘗試過使用多個線程,但由於這似乎是IO綁定,我沒有看到任何改進。

你很可能是正確的 - 讀取那么多文件可能會限制你的潛在加速,因為磁盤I / O將是限制因素。

話雖這么說,你很可能通過將數據處理傳遞到一個單獨的線程來做一點改進。

我建議嘗試使用單個“生產者”線程來讀取您的文件。 該線程將受IO限制。 當它讀取文件時,它可以將“處理”推送到ThreadPool線程(.NET 4任務也適用於此),以便進行處理,這將允許它立即讀取下一個文件。

這將至少占用整個運行時間的“處理時間”,使得您的工作總時間幾乎與磁盤IO一樣快,只要您有一兩個額外的核心工作...

我要做的是在一個單獨的線程中進行處理。 我會讀取文件並將數據存儲在隊列中,然后讀入下一個文件,依此類推。

在第二個線程中,讓線程從該隊列中讀取數據並對其進行處理。 看看是否有幫助!

它可能是磁盤搜索時間,這是限制因素(這是做Make時最常見的瓶頸之一,通常涉及大量小文件)。 啞文件系統設計有一個目錄條目,並且堅持指向文件的磁盤塊的指針,並且每個文件至少需要1次搜索。

如果您使用的是Windows,我將切換到使用NTFS( 目錄條目中存儲小文件( - >每個文件保存一個磁盤搜索)。我們也使用磁盤壓縮(更多計算但CPU便宜且快速)但是更少的磁盤空間 - >更少的讀取時間);如果您的文件都很小,這可能不相關。可能有一個Linux文件系統等效,如果你在哪里。

是的,您應該啟動一堆線程來讀取文件:

     forall filename in list:   fork( open filename, process file, close filename)

您可能需要對此進行限制以防止線程耗盡,但我會拍攝數百個而不是2或3.如果您這樣做,則告訴操作系統它可以讀取磁盤上的許多位置,它可以通過磁盤放置( 電梯算法 )對多個請求進行排序 ,這也有助於最大限度地減少頭部運動。

我同意里德和冰人的評論。 另外,考慮如何增加磁盤IO。 例如,將文件分布在多個磁盤上,以便可以並行讀取它們並使用更快的磁盤,如SSD或RAM磁盤。

我建議使用“MultiThreading”來解決這個問題。 當我讀到你的帖子答案時,突然發現Reed Copsey的答案會非常有成效。 您可以在此鏈接中找到由Elmue准備的此解決方案的示例。 我希望這可以有用,感謝Reed Copsey 問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM