2013-10-10 3 views
0

здесь является частью моего кода:QRegularExpressionMatch потребление памяти

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» заключается в вычислении, где поле заканчивается (целое число «конец») в следующей строке, переданной функции. Когда я компилирую с помощью KNOWN_PATTERN #defined и загружаю некоторый тестовый файл, для которого я знаю, что «конец» должен стать 19, моя программа потребляет на 400 МБ меньше памяти, чем при компиляции без KNOWN_PATTERN #defined. 400 МБ - это то, что все строки моего тестового файла занимают в памяти (я могу рассчитать его на основе размера файла, а также наблюдать за потреблением памяти при загрузке файла и до начала синтаксического анализа). Так мне кажется, что QRegularExpressionMatch создает копии каждой строки и не выпускает ее. Что мне здесь не хватает? Спасибо!

ответ

1

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

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

+0

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

+0

@mvidelgauz Он должен повторно использовать, когда нужно, так что это странно. Но действительно ли вам нужно загрузить всего 800 МБ одновременно? Это не самая масштабируемая идея в мире. – molbdnilo

+0

Он не возвращается, как я уже говорил, и да, я знаю, что обычно не рекомендуется загружать весь 800 МБ, но для конкретной программы это лучший способ достижения целей - программное обеспечение - это просмотрщик файлов log4j с несколькими видами/фильтрами/результаты поиска и быстрый просмотр назад и вперед в каждом (индивидуально отфильтрованном) представлении – mvidelgauz

Смежные вопросы