Как ускорить регулярное выражение для поиска большого количества потенциально больших файлов в C ++? - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь создать программу для чтения пользовательских символов подстановки и строк подстановки, используя документ Excel в качестве файла конфигурации.Например, пользователь может ввести C: \ Read * .txt, и любые файлы на диске C, начинающиеся с Read, а затем любые символы после чтения и текстовые файлы, будут включены в поиск.

Они могли бы искать Message: *, и все строки, начинающиеся с «Message:» и заканчивающиеся любой последовательностью символов, были бы сопоставлены.

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

Большая часть времени в моем коде проводится в следующем цикле (яМы включили только строки над циклом while, чтобы вы могли лучше понять, что я пытаюсь сделать):

smatch matches;
vector<regex> expressions;

for (int i = 0; i < regex_patterns.size(); i++){expressions.emplace_back(regex_patterns.at(i));}

auto startTimer = high_resolution_clock::now();
// Open file and begin reading
ifstream stream1(filePath);
if (stream1.is_open())
{
    int count = 0;
    while (getline(stream1, line))
    {
        // Continue to next step if line is empty, no point in searching it.
        if (line.size() == 0)
        {
            // Continue to next step if line is empty, no point in searching it.
            continue;
        }

        // Loop through each search string, if match, save line number and line text,
        for (int i = 0; i < expressions.size(); i++)
        {
            size_t found = regex_search(line, matches, expressions.at(i));
            if (found == 1)
            {
                lineNumb.push_back(count);
                lineTextToSave.push_back(line);
            }
        }
        count = count + 1;
    }
}
auto stopTimer = high_resolution_clock::now();
auto duration2 = duration_cast<milliseconds>(stopTimer - startTimer);
cout << "Time to search file: " << duration2.count() << "\n";

Есть ли лучший способ поиска файлов, чем этот?Я пытался искать много вещей, но не нашел программного примера, который я до сих пор понимал.

1 Ответ

0 голосов
/ 10 апреля 2019

Некоторые идеи в порядке приоритета:

  1. Вы можете объединить все шаблоны регулярных выражений вместе, чтобы сформировать единое регулярное выражение вместо сопоставления r регулярных выражений в каждой строке. Это ускорит вашу программу в r. Пример: (R1)|(R2)|(...)|(Rr)

  2. Перед использованием убедитесь, что вы скомпилировали регулярное выражение.

  3. Не добавляйте окончательный .* к вашему шаблону регулярных выражений.

Некоторые идеи, но не переносимые:

  1. Карта памяти файла вместо чтения через iostreams
  2. Подумайте, стоит ли переопределять grep вместо того, чтобы звонить по grep через popen()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...