在多个文件中搜索字符串的最佳方法是什么?
目前我正在对每个文件进行foreach循环,但是注意到需要4-5分钟来浏览所有4000多个文件
有没有某种平行的方法来做到这一点?
答案 0 :(得分:4)
执行此操作的最佳方式是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,但它允许多个线程同时处理所有读取的数据。
答案 1 :(得分:3)
如果您经常进行此搜索,请考虑使用某些搜索引擎(如Solr)索引文件。索引文件后,搜索将花费几毫秒。
您还可以在应用中嵌入搜索引擎,例如,使用Lucene库。
答案 2 :(得分:0)
可能大部分时间都花在等待从磁盘读取文件上。在这种情况下,多线程不会帮助你做大事 - 而不是让一个线程等待磁盘IO,你现在有几个线程在等待磁盘IO。
答案 3 :(得分:0)
对此的操作很大程度上是I / O限制,因此并行处理不会真正为您提供任何额外的性能。您可以尝试使用第三方搜索库索引文件,但就软件而言,这就是您所能做的一切。如果可以选择,将文件拆分到多个驱动器并为每个驱动器使用不同的线程可以帮助加快速度。