Самый быстрый способ поиска файлов ASCII в C # по простым ключевым словам? - PullRequest
2 голосов
/ 27 ноября 2010

Сейчас я ищу в файлах 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" );

Ответы [ 3 ]

5 голосов
/ 27 ноября 2010

В неуправляемом коде наиболее эффективным способом с точки зрения производительности будет использование Файлы с отображением в памяти вместо чтения файла в буфере.Я уверен, что наилучших результатов можно достичь только таким способом, особенно если файл, который вы хотите отсканировать, может быть файлом из удаленного хранилища (файл с сервера).

Я не уверенчто использование соответствующих классов .NET 4.0 в вашем случае будет точно таким же эффективным.

4 голосов
/ 27 ноября 2010

Просто загрузите текстовый файл в большую строку, используя метод StreamReader ReadToEnd и используйте string.IndexOf ():

string test = reader.ReadToEnd();

test.indexOf("keyword")
1 голос
/ 27 ноября 2010

Если вам действительно нужна большая производительность (обработка файлов порядка сотен МБ или ГБ), тогда вместо построчного поиска следует читать строки по блокам, возможно, по 1 Кб и выполнять поиск по ним,Несмотря на то, что приходится иметь дело с некоторыми граничными условиями, это должно оказаться быстрее.

При этом вам следует применить профилировщик, такой как ANTS, чтобы увидеть, действительно ли это ваше узкое место.

...