在多个文件中搜索字符串的最佳方法是什么?
目前我正在对每个文件执行foreach循环,但注意到遍历所有4000+文件最多需要4-5分钟
有没有什么并行的方法可以做到这一点?
发布于 2013-06-22 03:36:22
做到这一点的最好方法是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,但它允许多个线程同时处理所有读取的数据。
发布于 2013-06-22 03:31:14
如果你经常进行这种搜索,可以考虑使用一些搜索引擎来索引你的文件,比如Solr。索引文件后,搜索将需要几毫秒。
你也可以在你的应用中嵌入搜索引擎,例如,使用Lucene库。
发布于 2013-06-22 03:31:49
大多数时间都花在等待从磁盘读取文件上。在这种情况下,多线程不会对您有很大的帮助-不是让一个线程等待磁盘IO,而是现在有多个线程等待磁盘IO。
https://stackoverflow.com/questions/17242907
复制相似问题