Russian Qt Forum
Ноябрь 26, 2024, 02:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти?  (Прочитано 6064 раз)
Aeon
Гость
« : Февраль 04, 2010, 08:21 »

есть следующий код
Код
C++ (Qt)
foreach(QString tmp, filenames)
       {
 
         QFile file(tmp);
         if (!file.open(QFile::ReadOnly))
          qDebug() << "cant open file";
 
         QXmlQuery query;
         query.bindVariable("inputDocument", &file);
         query.setQuery(queryString);
 
         if (!query.isValid())
           {
             RED_DEBUG;
             qDebug("Hi, i'm error");
             RESET_COLORIZED_DEBUG;
            }
         QString query_result;
         if (query.evaluateTo(&query_result))
           {
             QStringList values = query_result.trimmed().split("*");
             if (values.size() != 10)
               {
                 YELLOW_DEBUG;
                 qDebug("wrong number of values");
                 RESET_COLORIZED_DEBUG;
               }
             else
               {
                 sqlQuery.prepare("INSERT INTO data (fname, regnumb, person, "
                                  "type, period, date, kind, correction, numb, ammount) "
                                  "VALUES (:fname, :regnumb, :person, :type, :period, "
                                  ":date, :kind, :correction, :numb, :ammount)");
                 for (int i=0; i<10; i++)
                   {
 
                     sqlQuery.bindValue(i, values.at(i));
                   }
                 if (!sqlQuery.exec())
                   {
                     RED_DEBUG;
                     qDebug("sql query not executed");
                     RESET_COLORIZED_DEBUG;
                   }
 
               }
           }
         else
           {
                  RED_DEBUG;
                  qDebug() << "xmlquery error";
                   RESET_COLORIZED_DEBUG;
                }
         file.close();
 
       }
Когда идёт обработка, приложение память просто пожирает со страшной скоростью.  После обработки 12-ти тысяч файлов съело около 1.5 гигабайт.
ткните носом где ошибка, целый день уже сижу, не могу разобраться  Грустный
попробовал с qt 4.5.3 и 4.6.0 - результат одинаковый.
ос - Федора 12.
Записан
BRE
Гость
« Ответ #1 : Февраль 04, 2010, 08:35 »

Под valgrind запускал?
Записан
Aeon
Гость
« Ответ #2 : Февраль 04, 2010, 08:52 »

да.
правда валгринд для меня, конечно - "злое колдунство"
но строку
Код:
==27934== All heap blocks were freed -- no leaks are possible
я вполне понял.
ошибки он вообще находит, но они относятся, в основном к libGLcore.so

также пробовал заюзать google perfomance tools.
тоже никаких ответов.

Записан
Rcus
Гость
« Ответ #3 : Февраль 04, 2010, 09:04 »

У Valgrind есть режим massif для изучения распределения памяти в ходе работы приложения.
Записан
Sancho_s_rancho
Гость
« Ответ #4 : Февраль 04, 2010, 16:50 »

Я xml-ов не нюхал и может проблема в их обработке. Но явную хрень представляет собой открытие  файла, проверка открылся ли и последующая работа с ним даже если он не открылся

Код:
QFile file(tmp);
          if (!file.open(QFile::ReadOnly))
           qDebug() << "cant open file";
 
          QXmlQuery query;
          query.bindVariable("inputDocument", &file);
          query.setQuery(queryString);
Записан
KADABRA
Гость
« Ответ #5 : Февраль 04, 2010, 19:26 »

есть следующий код
...
Интереса ради, после sqlQuery.exec() добавьте sqlQuery.clear().
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #6 : Февраль 04, 2010, 21:38 »

Да и вместо QXmlQuery поюзай лудше QXmlStreamReader, да геморойно, да парсить самому придется, ну чуится мне что QXmlQuery хранит файл в памяти, а удаляет его от туда либо по желанию програмера либо при уничтожении, в твоем случае мне кажется что это будет по выходу из процедуры, может я неправ конечно, но еше как вариант попробуй в самом конце цикла написать query.deleteLater();
Записан
Aeon
Гость
« Ответ #7 : Февраль 05, 2010, 00:35 »

Я xml-ов не нюхал и может проблема в их обработке. Но явную хрень представляет собой открытие  файла, проверка открылся ли и последующая работа с ним даже если он не открылся
да, хрень, но дело явно не в этом.
Интереса ради, после sqlQuery.exec() добавьте sqlQuery.clear().
пробовал уже... нулевой результат.
удаляет его от туда либо по желанию програмера либо при уничтожении, в твоем случае мне кажется что это будет по выходу из процедуры, может я неправ конечно, но еше как вариант попробуй в самом конце цикла написать query.deleteLater();
да я то желаю его оттуда удалить, но нет у класса QXmlQuery членов, которые позволяют это сделать.
код который я написал выполняется в отдельном треде, память не высвобождается не то что по выходу из процедуры, а даже после того, как отрабатывает тред... сигнал finished мне от него приходит, а память не освобождается.
и...
Код:
‘class QXmlQuery’ has no member named ‘deleteLater’

Грустный
У Valgrind есть режим massif для изучения распределения памяти в ходе работы приложения.
С наскоку с массифом разобраться не получилось. Буду сейчас ман грызть дальше


---
так...
вынес создание QXmlQuery за цикл...  использование памяти упало до 600 метров... это конечно хорошо, но ресурс в итоге всё равно ведь не освобождается.
« Последнее редактирование: Февраль 05, 2010, 01:27 от Aeon » Записан
Aeon
Гость
« Ответ #8 : Ноябрь 02, 2010, 09:16 »

Решил проверить,  профиксили ли баг в 4.7, оказалось, что нет.
Кто может, проголосуйте за него - http://bugreports.qt.nokia.com/browse/QTBUG-5823
А то с тем количеством голосов, что у него сейчас - надежды мало.
Записан
crackedmind
Гость
« Ответ #9 : Ноябрь 02, 2010, 10:28 »

QSqlQuery sqlQuery; за пределами цикла объявлено? Если так, то сам себе злобный буратино, на каждой итерации при вызове prepare забиваются внутренние данные типа массив и хэшей. Сорцы Qt для чего существуют? Улыбающийся
Записан
Aeon
Гость
« Ответ #10 : Ноябрь 03, 2010, 02:02 »

если попробовать пройти по ссылке выше, то там явно ни слова про sql не написано.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.154 секунд. Запросов: 23.