Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C#搜索ASCII文件中简单关键字的最快方法?_C#_.net_Performance_Io - Fatal编程技术网

用C#搜索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

现在,我在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" );

如果您真的想要更高的性能(处理数百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")