QRegularExpressionMatch потребление памяти

0

вот часть моего кода:

    int Parser::SomeFunction(const QString &line, int start, int& fieldStart, int& fieldLength ) const
{
    int end;
......
    if (0 == m_pRegExp)
    {
......
    }
    else
    {
#ifdef KNOWN_PATTERN
        end = 19;
#else

        QRegularExpressionMatch match = m_pRegExp->match(line,  start);
        if (!match.hasMatch())
        {
            return 0;
        }

        // currently we are requiring match to be found exactly at the position 'start'
        if (match.capturedStart() != start)
        {
            return 0;
        }

        end = match.capturedEnd();
#endif
    }
.....
}

Программа загружает текстовый файл и анализирует его строки один за другим. Вся цель кода в 'else scope - вычислять, где поле заканчивается (целое число) в следующей строке, переданной функции. Когда я компилирую с помощью KNOWN_PATTERN #defined и загружаю некоторый тестовый файл, для которого я знаю, что конец должен стать 19, моя программа потребляет на 400 МБ меньше памяти, чем при компиляции без KNOWN_PATTERN #defined. 400 МБ - это то, что все строки моего тестового файла занимают в памяти (я могу рассчитать его на основе размера файла, а также наблюдать за потреблением памяти при загрузке файла и до начала синтаксического анализа). Поэтому мне кажется, что QRegularExpressionMatch создает копии каждой строки и не выпускает ее. Что мне здесь не хватает? Благодарю!

Теги:
qt

1 ответ

1

Диспетчер задач и т.д. - очень тупые инструменты для наблюдения за распределением памяти во время выполнения C++.

В частности, среда выполнения не обязательно выводит освобожденную память обратно в ОС, так как распределение памяти ОС относительно медленно на многих платформах, но держится за нее для себя.

  • 0
    Спасибо, молбднило за ваш ответ. Если ОС откладывает фактическое освобождение памяти, то я ожидаю, что она будет использовать ее снова при новых запросах на выделение. Но моя 32-разрядная программа достигает своего предела 2 ГБ в Windows и вылетает, когда я загружаю файл размером 800 МБ - только потому, что эти 800 МБ дублируются временными файлами, подобными тем, что показаны в коде, который я показал, и не освобождаются и не используются повторно? Во-вторых, можете ли вы предложить лучшие инструменты для мониторинга фактического использования памяти в Windows? Спасибо
  • 0
    @mvidelgauz Следует использовать повторно, когда это необходимо, так что это странно. Но вам действительно нужно загрузить все 800 МБ за один раз? Это не самая масштабируемая идея в мире.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню