现在,我在ASCII文件中搜索这样的简单关键字:
int SearchInFile (string file, string searchString)
{
int num = 0;
StreamReader reader = File.OpenText (file);
string line = reader.ReadLine();
while (line != null)
{
int count = CountSubstrings(line, searchString);
if (count != 0)
{
num += count;
}
line = reader.ReadLine();
}
reader.Close();
return num;
}
这是最快,最有效的内存方式吗?如果计数会对搜索方式产生巨大影响,那么返回计数是可选的,但不是单独存在。
我用它像:
SearchInFile ( "C:\\text.txt", "cool" );
答案 0 :(得分:5)
在非托管代码中,性能方面最有效的方法是使用Memory-Mapped Files而不是在缓冲区中读取文件。我确信只有在这种方式下才能实现最佳结果,特别是如果您要扫描的文件可能是来自远程存储的文件(来自服务器的文件)。
我不确定相应的.NET 4.0 classes的使用情况与您的情况完全相同。
答案 1 :(得分:4)
使用StreamReader的ReadToEnd方法将文本文件加载到一个大字符串中,然后使用string.IndexOf():
string test = reader.ReadToEnd();
test.indexOf("keyword")
答案 2 :(得分:1)
如果你真的想要更高的性能(处理大约数百MB或GB的文件),那么你应该按照大约1k的块读取字符串,然后对它们进行搜索,而不是逐行搜索。 。尽管必须处理一些边界条件,但这应该更快。
话虽这么说,你应该应用像ANTS这样的探查器,看看这是否真的是你的瓶颈。