在多個文件中搜索字符串的最佳方法是什麼?4000個文件,我想要做一個字符串搜索
目前我做的通過每個文件foreach循環,但已經注意到它佔用4-5min要經過所有4000+文件
是否有某種平行的方式來做到這一點?
在多個文件中搜索字符串的最佳方法是什麼?4000個文件,我想要做一個字符串搜索
目前我做的通過每個文件foreach循環,但已經注意到它佔用4-5min要經過所有4000+文件
是否有某種平行的方式來做到這一點?
如果您正在進行這種搜索,請考慮使用一些搜索引擎索引您的文件,如Solr。文件索引後,搜索將花費毫秒。
您還可以在您的應用中嵌入搜索引擎,例如,使用Lucene庫。
很可能大部分時間都花在等待文件從磁盤讀取。在這種情況下,多線程並不會幫助您達成一筆大交易 - 而是讓一個線程等待磁盤IO,而現在您有多個線程正在等待磁盤IO。
不一定,如果將文件緩存到RAM中,並且文件的大小爲幾個兆字節,則搜索行爲會顯着慢於讀取文件的速度。 –
對此的操作很大程度上將被I/O限制,因此並行處理不會真的爲您提供任何額外的性能。您可以嘗試使用第三方搜索庫對這些文件編制索引,但這是軟件所能做的所有事情。如果這是一個選項,將文件分割到多個驅動器並對每個驅動器使用不同的線程可以幫助加快速度。
對於幾兆字節的文件,搜索速度可能比加載文件慢得多。 –
對於典型的內存帶寬與I/O速度的比較,這似乎不大可能。考慮到數千個文件可能不在連續空間中,大多數時間可能等待磁盤的查找頭重新定位。只是我的想法。 – Nathan
做到這一點的最好方法是Producer Consumer model。你所做的是你有一個線程從硬盤讀取並將數據加載到一個隊列中,然後你有不確定數量的其他線程處理數據。
所以說你的舊代碼是這樣的
foreach(var file in Directory.GetFiles(someSearch)
{
string textToRead = File.ReadAllText(file);
ProcessText(textToRead)
}
新代碼將是
var collection = new BlockingCollection<string>(); //You may want to set a max size so you don't use up all your memory
Task producer = Task.Run(() =>
{
foreach(var file in Directory.GetFiles(someSearch)
{
collection.Add(File.ReadAllText(file))
}
collection.CompleteAdding();
});
Parallel.ForEach(collection.GetConsumingEnumerable(), ProcessText); //Make sure any actions ProcessText does (like incrementing any variables in the class) is done in a thread safe manner.
它可以讓一個線程從硬盤驅動器讀取這樣做是不打任何其他線程I/O,但它可以讓多個線程同時處理所有讀取的數據。
我之前沒有使用過BlockingCollection,但是如果我知道它對於我以前的一些項目來說可能是我用過的。 – Katana314
是的,它真的很好,它處理所有線程安全的東西,使用'GetConsumingEnumerable()'使它非常簡單。有一點需要注意,默認情況下,BlockingCollection使用[ConcurrentQueue](http://msdn.microsoft.com/zh-cn/library/dd267265。aspx),因爲它是內部存儲,如果您不關心集合中出現的順序,您可以使用[其他構造函數](http://msdn.microsoft.com/zh-cn/library/dd287133.aspx )並傳入一個[ConcurrentBag](http://msdn.microsoft.com/en-us/library/dd381779.aspx)並減少資源爭用。 –
完美!所以我的下一個問題是,我有一個類,我正在更新每個方法,但不知道如何將類傳遞到我的「ProcessText」方法。我將如何處理?謝謝btw,這是我第一次聽說BlockingCOllection以及:) – KPS
1)買一個大的SSD,2)買一個大的RAID陣列(然後只用線程) –
從一個物理設備順序讀取是最好的事情,你可以做的情況下的性能。如果您一次打開10個文件並嘗試掃描它們,則每次在硬盤上執行操作時都會因過度搜索而受到損失。另外,你做了測量,發現哪裏是最大的等待? –
如果你知道關於這些文件的任何具體內容......比如你正在搜索的文本帶有文件的前100個字節,你可以通過只打開這些字節節省一些時間。更快的搜索/更快地關閉文件。 – Gray