用C#搜索ASCII文件中简单关键字的最快方法?
现在,我在ASCII文件中搜索以下简单关键字:用C#搜索ASCII文件中简单关键字的最快方法?,c#,.net,performance,io,C#,.net,Performance,Io,现在,我在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(l
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" );
如果您真的想要更高的性能(处理数百MB或GB的文件),那么您不应该逐行搜索,而应该按1k的块读取字符串并对其进行搜索。尽管需要处理一些边界条件,但这应该会更快
也就是说,您应该应用ANTS之类的探查器,看看这是否真的是您的瓶颈。只需使用StreamReader的方法将文本文件加载到一个大字符串中,然后使用string.IndexOf():
在非托管代码中,性能方面最有效的方法是使用,而不是读取缓冲区中的文件。我确信,只有这样才能获得最佳效果,特别是如果要扫描的文件可能是来自远程存储的文件(来自服务器的文件)
我不确定在您的情况下使用相应的.NET 4.0是否会完全一样有效。您现在拥有的功能在大多数实际应用中都会很好。谢谢,您认为它会更快吗?我可以在显式后立即清理内存吗?这可能会更快,但对于非常大的文件来说是危险的,因为用户的计算机可能没有足够的内存。@Joan没有指定他要搜索大文件。对于大文件,他必须使用一些特定的算法,如Rabin–Karp字符串搜索算法或Boyer–Moore算法。是的,取决于文件的大小。您可能还希望使用TPL来并行化行的读取/搜索。您可以使用管道模式将其设置为尽快运行。“大”字符串与普通字符串有什么区别?:)内存映射文件现在在.NET中也可用。(.net 4.0)@Eric Falsken:我知道内存映射文件现在在.net 4.0中可用,请按照我答案最后几句的链接进行操作。但区别在于,在非托管代码
MapViewOfFile
中,为您获取一个表示(分页文件)文件的内存指针。可以直接使用任何函数使用指针搜索子字符串。在.NET中,CreateViewAccessor
和CreateViewStream
更多用于读取文件部分的文件还包含其他内容。因此,在分配额外内存的过程中会产生更多的开销。
string test = reader.ReadToEnd();
test.indexOf("keyword")