首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要对其进行字符串搜索的4000个文件

要对其进行字符串搜索的4000个文件
EN

Stack Overflow用户
提问于 2013-06-22 03:28:33
回答 4查看 259关注 0票数 1

在多个文件中搜索字符串的最佳方法是什么?

目前我正在对每个文件执行foreach循环,但注意到遍历所有4000+文件最多需要4-5分钟

有没有什么并行的方法可以做到这一点?

EN

回答 4

Stack Overflow用户

发布于 2013-06-22 03:36:22

做到这一点的最好方法是Producer Consumer model。这样做的目的是让一个线程从硬盘读取数据,并将数据加载到队列中,然后让不确定数量的其他线程处理数据。

假设你的旧代码是这样的

代码语言:javascript
复制
foreach(var file in Directory.GetFiles(someSearch)
{
     string textToRead = File.ReadAllText(file);
     ProcessText(textToRead)
}

新的代码将是

代码语言:javascript
复制
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,但它允许多个线程同时处理所有读取的数据。

票数 4
EN

Stack Overflow用户

发布于 2013-06-22 03:31:14

如果你经常进行这种搜索,可以考虑使用一些搜索引擎来索引你的文件,比如Solr。索引文件后,搜索将需要几毫秒。

你也可以在你的应用中嵌入搜索引擎,例如,使用Lucene库。

票数 3
EN

Stack Overflow用户

发布于 2013-06-22 03:31:49

大多数时间都花在等待从磁盘读取文件上。在这种情况下,多线程不会对您有很大的帮助-不是让一个线程等待磁盘IO,而是现在有多个线程等待磁盘IO。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17242907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档