CSharp - 在文本文件中,搜索字符串的更快速方式

  显示原文与译文双语对照的内容
0 0

我需要搜索字符串,大约有13个字符,在一组文本文件使用C# 。 文本文件的数量正在变化,范围介于100 1000 。 之间的文件大小的范围可以1KB和10MB 。

我试过的naive方法打开每个文件,读取它逐行看看如果字符串存在( 用索引单击"兼容性视图),但这非常慢。 我也试着按5 秒,但仍使用BM(BoyerMoore)算法算法,并提高时序,这感觉慢。

知道有关如何加快搜索?

时间:原作者:8个回答

0 0

根据要进行多少次'search',你到底要不要使用搜索引擎。 如果你要搜索在很多时候,使用搜索引擎进行搜索,否则: 没有这样做。 同时,我将描述如何实现场景来了

当使用搜索引擎: 听起来要查找的子字符串,这意味着你应该编制文件使用你喜爱的搜索引擎,因此最好是一个可以自定义( Lucene,小猎犬等) 所需要的技术是移动索引trigrams,即: 三个字符组合都必须被索引。 f .ex .: '将生成'foobar'foo','oob','oba','bar'。 在搜索时,要进行同样的查询,然后执行一个查询使用与这些trigrams的搜索引擎。 ( 在过帐运行的合并联接列表中的文件,这些文件将返回其ID为或你输入内容的发帖列表) 。

或者,可以实现你的文件后缀数组和索引一次。 这将给大家带来更多的灵活性为短( 12点) 如果要搜索子字符串的索引的问题,还是就越难维护。 文件检索索引的( 有一些研究在CWI/Amsterdam后缀数组)

如果希望只搜索几次,要使用的算法可以为BM(BoyerMoore)算法( I 通常使用Boyer摩尔周日按照[ Graham A 。 stephen,string Search] ) 或编译DFA ( 可以构造它们从NFA,这是比较容易) 。 但是,只给你很小的速度增加,",就是因为磁盘IO可能是你的瓶颈和比较所需一堆字节进行解码,总之还是很快。

最大的改进可以使不是逐行读取你的文件,而是块中的行。 应该NTFS配置为使用的块大小为64 KB如果可以和阅读中的文件为64相乘KB认为4 MB或多个在单个读取。 我甚至建议你使用异步IO,以便你能阅读并处理( 以前) 同时读取数据。 如果你做的是正确的,应该已经给你一眨眼的时间实现10 MB在当今的大多数硬件。

最后一个也是个优雅的信息检索中所使用的技巧也是你使用快速的压缩算法对数据进行压缩。 也因为磁盘IO比较慢,dan memory/cpu操作,该操作可能帮助。 google Snappy compressor是一个很好的例子是快速压缩算法。

原作者:
0 0

想到了两个选项:

在内存中读取文本文件,直接一次搜索整个字符串。

如果这都是事实,太慢或太内存饥饿,使用索引器时,喜欢Apache Lucene 。 有慢慢来SDK该适用于.NET,称为Lucene .NET

下面是一个简单的介绍它: http://www .codeproject .com/Articles/29755/Introducing Lucene Net

原作者:
0 0

你应该考虑使用操作系统文件搜索与内容。 来看一下 MicrosoftWindows搜索3 。x SDK?

也可以利用PLINQ数组中搜索文件。 参阅以下链接:

File Content和Directory Search使用Directory .GetFiles和PLINQ

原作者:
0 0

如果计算机自己能尝试所有文本文件加载到内存中( 使用技术所示然后计算文本在内存中。

如果你无法一次处理的所有文件,然后重新启动计算机,最小的文件。 文件I/O则有可能成为最大的支出是什么,所以尽可能的希望最大程度减少。

原作者:
0 0

你可以使用Microsoft的索引服务来搜索文档的文件夹中,你应添加在目录里。 Here 是个非常实用的文章,可以让用户搜索你的文本文件

原作者:
...