Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: Верните память!!!)  (Read 5563 times)

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Верните память!!!)
« on: October 04, 2017, 04:55:13 pm »
С того момента как вы выпустили 1.4.6 отлично ее пользовал уже месяцев 5, пока в один прекрасный момент (вчера) не пришлось генерить отчет на 1500 страниц. Отчет сгенерился нормально, но закрывалось это все дело минуты 3, при этом пролист страниц был довольно тормозной.
Решил проверить наличие новой версии и вуаля 1.4.7
Все собрал, запустил, сгенерил - все отлично, генериться пролистывается и закрывается быстро, но выжирается памяти просто немеренно (около 1500 страниц - 1Гб). Но фиг с ним выедается - НЕ ОСВОБОЖДАЕТСЯ.

И второе, может я чего не понимаю но setShowProgressDialog(true); не работает. По крайней мере у меня никакого прогресс бара не появляется.

код в студию:

Code: [Select]

namespace report {

typedef QMap<QString, QString> Variables;
typedef QMapIterator<QString, QString> VarsIter;

class reports_printer : public Singleton<reports_printer>
{

private:
    reports_printer() : m_report(nullptr) { ; }
    //
    reports_printer(const reports_printer &) = delete;
    reports_printer& operator = (const reports_printer &) = delete;
    //
    virtual ~reports_printer() { reset_report(); }

public:
    void create_report(QAbstractItemModel* data, QString report_templte, Variables vars = Variables())
    {       
        m_report = new LimeReport::ReportEngine;

        if(data && !report_templte.isEmpty())
        {
            if(vars.isEmpty()) qDebug() << "No variables";
            else
            {
                VarsIter iter(vars);//  vars.begin();
                while(iter.hasNext())
                {
                    iter.next();
                    m_report->dataManager()->setReportVariable(iter.key(), QVariant(iter.value()));
                }
            }

            const QString REPORT_MODEL_NAME = "table_model";
            m_report->dataManager()->addModel(REPORT_MODEL_NAME, data, false);
            if(!m_report->loadFromFile(report_templte))
            {
                qDebug() << "Wrong report template";
                reset_report();
                return;
            }

            if (ref_data::get()->debug_prn())
            {
                m_report->designReport();
            }
            else
            {
                m_report->setPreviewWindowTitle(QObject::tr("Preview"));
                //m_report->createPreviewWidget()->show();
                m_report->setResultEditable(false);
                m_report->setShowProgressDialog(true);
                m_report->previewReport();           
            }
        }
        else
        {
            if(!data)                    qDebug() << "Wrong data: nullptr";
            if(report_templte.isEmpty()) qDebug() << "Wrong report template: path is empty";
        }
        reset_report();
    }

private:
    void reset_report()
    {
        QGuiApplication::restoreOverrideCursor();
        if(m_report) delete m_report;
        m_report = nullptr;
    }

    friend class Singleton<reports_printer>;

private:
    LimeReport::ReportEngine* m_report;
};


} // namespace report


т.е после каждого построения отчета всегда (ну только если откуда -нить exception не вылетит) вызывается reset_report. Но top мне упорно показывает 1 Гиг отожранной памяти.

Спасибо.
« Last Edit: October 04, 2017, 05:08:29 pm by Dark2011 »

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Верните память!!!)
« Reply #1 on: October 04, 2017, 05:35:26 pm »
На данный момент на github доступна новая версия 1.4.45
https://github.com/fralx/LimeReport/releases/tag/1.4.45
Можете её попробовать и сказать сохранились ли проблемы с утечкой памяти ?

setShowProgressDialog() это для отключения показа диалога если отчет генерится из дизанера.
Если есть желание показывать прогресс, то у ReportEngine есть сигналы

renderStarted()
renderPageFinished(int)
renderFinished()

 
« Last Edit: October 04, 2017, 05:54:43 pm by Arin Alex »

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Re: Верните память!!!)
« Reply #2 on: October 06, 2017, 11:51:08 am »
Добрый день. Собрал эту версию - различий не увидел.
Прикрепил скриншотик с наблюдениями за жором в top:

красным обозначен момент начала рендеринга, синим - момент закрытия отчета и удаления LimeReport::ReportEngine;

Спасибо.
« Last Edit: October 06, 2017, 11:52:52 am by Dark2011 »

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Верните память!!!)
« Reply #3 on: October 06, 2017, 09:16:18 pm »
Потестил на количестве страниц сравнимых с вашим.
Получил следующий результат.

на пике потребления было 600 метров потом в результате стало 49.21 метров.
память освобождается но на это требуется довольно большое количество времени.
Возможно вы просто не дождались окончания процесса освобождения памяти?

Большое количество страниц с большим количеством элементов - ситуация, которая требует доработки :)

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Re: Верните память!!!)
« Reply #4 on: October 09, 2017, 10:02:32 am »
А вы на какой операционке сейчас это проверяли?

Полчуается интересная ситуация - я создаю отчет - у меня скушано 1 Гб, закрываю отчет память остается заюзаной. Потом я создаю такой же огронмый отчет - и памяти больше не выедается т.е получается это на уровне операционки чтоли, процесс не спешит возвращать память? Интересно можно на уровне системных вызовов изменить такое поведение?
Ну я не знаю... сколько надо подождать)? Я ждал минут 5)

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: Верните память!!!)
« Reply #5 on: October 09, 2017, 01:35:29 pm »
Ну, если Вы под виндой работаете, с адекватным объемом оперативки и наличием файла подкачки (виртуальной памяти или как угодно это обзовите), посмотрите на параметр "Кэшировано" в диспетчере задач. Ваша память скорее всего там. Волноваться не стоит особо, при нехватке оперативного простора, ОС забудет про лаймреморт и отдаст эту память нуждающимся.

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

Можно, например, тут почитать немого https://geektimes.ru/post/92165/

Arin Alex

  • Developer
  • Administrator
  • Hero Member
  • *****
  • Posts: 1005
    • View Profile
Re: Верните память!!!)
« Reply #6 on: October 09, 2017, 04:20:13 pm »
Quote from: Dark2011
А вы на какой операционке сейчас это проверяли?

Проверял на windows.

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Re: Верните память!!!)
« Reply #7 on: October 10, 2017, 10:03:59 am »
Ну да на винде норм все возвращает, а вот на ubunte возвращает если появляются нуждающиеся - создавал второй такой отчет в паралельно запущенной программе - память перераспределяется.

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: Верните память!!!)
« Reply #8 on: October 10, 2017, 11:37:10 am »
Preload на ubbunte похоже установлен.. глянь в установленных пакетах

Dark2011

  • Newbie
  • *
  • Posts: 27
    • View Profile
Re: Верните память!!!)
« Reply #9 on: October 11, 2017, 10:05:58 am »
неа, не стоит

Subst

  • Sr. Member
  • ****
  • Posts: 450
    • View Profile
Re: Верните память!!!)
« Reply #10 on: October 13, 2017, 10:31:34 am »
покопайся по форумам, в линуховых системах можно прописать оставлять ли в памяти данные программ, или скидывать в свап даже при наличии оперативки незанятой.

где-то вот рекомендуют /proc/sys/vm/swappiness тут смотреть. Значение - что-то вроде "сколько в процентах оставлять памяти", т.е. 0 - будет держать до последнего, 100 - все будет в свап скидывать как только не нужно

Ну линух такая весчь, как скажешь так и будет - это раз, два - где что хранит каждая сборка, нужно искать