Я пытаюсь создать программу для чтения пользовательских символов подстановки и строк подстановки, используя документ 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";
Есть ли лучший способ поиска файлов, чем этот?Я пытался искать много вещей, но не нашел программного примера, который я до сих пор понимал.