Увеличение объема занимаемой ОЗУ

Обсуждение Stimulsoft Reports.NET
walle93
Сообщения: 21
Зарегистрирован: 02 июл 2013, 22:25

Увеличение объема занимаемой ОЗУ

Сообщение walle93 »

Всем здравствуйте!!
Версия: StimulsoftReports.Net_2012.3.
Задача: имеется отчет в WinForms, там же и DataSet с таблицей. В таблице (к сведению) помимо строковых данных(всего 60 столбцов) имеется и 2 картинки размером до 20-40 Кб. Данные подгружаются из БД в таблицу DataSet'а в цикле. Если в таблице набирается 50 строк, то формируется отчет и сохраняется в формате pdf, затем очищается таблица. Дальше продолжаем цикл и опять "вливаем" данные в таблицу и опять ждем пока 50 шт накопится.

Код формирования и сохранения отчета:

Код: Выделить всё

Отчет.RegReportDataSources();
                    Отчет.Collate = 4;
                    Отчет.Render(false);
                    Отчет.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, String.Concat(folder_name, "\\", file_name, ".pdf"), settings);
                    Отчет.Dispose();
Проблема: Во время выполнения растет постоянно количество занимаемой ОЗУ и растет как бы "стесняясь" - 15,13,20,17,25 и т.д., т.е. повысилось чуть уменьшилось, повысилось. И это при том, прога не раз вызывает функцию с циклом обработки и очищает ресурсы.
Не буду утверждать что проблема именно в работе с отчетом, но может кто-нибудь подскажет.
И в целом правильно ли я работаю с отчетом, может не такой алгоритм формирования отчета(т.е. может ошибка именно в коде выше)?
P.S. Может будет полезно для определения причины. Почитав в интернете статью http://msdn.microsoft.com/ru-ru/magazine/cc163491.aspx и проведя мониторинг памяти, все указывает на утечку в Управляемой памяти .
Заранее спасибо!
Andrew
Сообщения: 586
Зарегистрирован: 09 июн 2006, 12:22

Re: Увеличение объема занимаемой ОЗУ

Сообщение Andrew »

Здравтвуйте,

У Вас может происходить утечка памяти в методе Render.

Почитайте, пожалуйста, данную статью
http://support.stimulsoft.com/index.php ... rom-memory

Спасибо.
walle93
Сообщения: 21
Зарегистрирован: 02 июл 2013, 22:25

Re: Увеличение объема занимаемой ОЗУ

Сообщение walle93 »

Спасибо за ссылку. Вот только не знаю как генерировать отчет в новом домене???
walle93
Сообщения: 21
Зарегистрирован: 02 июл 2013, 22:25

Re: Увеличение объема занимаемой ОЗУ

Сообщение walle93 »

И если использовать метод, который описан в ссылке, то имя файла отчета что из себя представляет - dll, mrt или еще что-то??? И как в целом лучше работать с отчетами, учитывая, что формы могут изменяться?
Сейчас я отчет как элемент управления кидаю на форму, к нему кидаю DataSet и дальше привязываю и в дизайнере уже вид придаю. При этом никаких файлов для отчета не создаю. Получается, если изменяется форма отчета, то приходится через VisualStudio заходить в дизайнер этого отчета, исправлять, заново компилировать все приложение (или dll).
Верен ли этот подход или нет? Если нет, то подскажите как или направьте.
Еще раз спасибо!
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Увеличение объема занимаемой ОЗУ

Сообщение HighAley »

Здравствуйте.

Для начала попробуйте обновиться до последнего предрелизного билда. У нас были некоторые исправления, связанные с утечкой памяти.
Так же это может быть связано со сборщиком мусора. Попробуйте принудительно его вызывать через несколько генераций отчётов, используя следующий код:

Код: Выделить всё

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
А скомпилированные в сборки отчёты при любом изменении надо компилировать заново. Также это надо сделать при смене версии наших сборок.
По поводу использования Application Domain вы можете прочитать на MSDN http://msdn.microsoft.com/en-us/library/yb506139.aspx

Спасибо.
walle93
Сообщения: 21
Зарегистрирован: 02 июл 2013, 22:25

Re: Увеличение объема занимаемой ОЗУ

Сообщение walle93 »

Спасибо! Методы уже не плохо начали работать, и память уже не пропадает. Но вот иногда возникают ошибки в отчете - не правильно компонуются страницы. И причем не могу изменениями в коде это выловить. Код следующий: в начале функции инициализирую переменную StiReport

Код: Выделить всё

MainReport = new Stimulsoft.Report.StiReport();
            MainReport.Load(ОТЧЕТ.SaveToByteArray());
            StiMainReportFolder = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
            StiMainReportFolder = Path.Combine(StiMainReportFolder, "Stimulsoft\\CompiledReports");
            StiMainReportFolder = Path.Combine(StiMainReportFolder, System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion().ToString());
            StiMainReportCompiledReportFile = Path.Combine(StiMainReportFolder, MainReport.GetReportAssemblyCacheName());
затем в цикле уже по мере заполнения сохраняю в файл:

Код: Выделить всё

if (File.Exists(StiMainReportCompiledReportFile))
                {
                    MainReport = Stimulsoft.Report.StiReport.GetReportFromAssembly(StiMainReportCompiledReportFile, true);
                    MainReport.RegData(DSProtocol_Table);
                }
                else//Compiled report does not exist
                {
                    MainReport.RegData(DSProtocol_Table);
                    if (!Directory.Exists(StiMainReportFolder))
                        Directory.CreateDirectory(StiMainReportFolder);
                    MainReport.Compile(StiMainReportCompiledReportFile);
                }
                MainReport.Collate = 4;
                MainReport.Render(false);
                MainReport.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, String.Concat(folder_name, "\\", file_name, ".pdf"), settings);
так вот, ПРАВИЛЬНЫЙ ЛИ у меня порядок действий??? Compile, RegData, Collate, Render ???
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Увеличение объема занимаемой ОЗУ

Сообщение Aleksey »

Здравствуйте,

Да, по идее, порядок правильный RegData, Compile, Collate, Render.
Сложно так сказать, без примера, из-за чего такое может возникать.

Спасибо.
walle93
Сообщения: 21
Зарегистрирован: 02 июл 2013, 22:25

Re: Увеличение объема занимаемой ОЗУ

Сообщение walle93 »

Просто получается, что неправильный отчет получается только при первом проходе, а затем все нормально. То есть вот этот код уже нормально работает:

Код: Выделить всё

if (File.Exists(StiMainReportCompiledReportFile))
                {
                    MainReport = Stimulsoft.Report.StiReport.GetReportFromAssembly(StiMainReportCompiledReportFile, true);
                    MainReport.RegData(DSProtocol_Table);
                }
                else//Compiled report does not exist
                {
                    MainReport.RegData(DSProtocol_Table);
                    if (!Directory.Exists(StiMainReportFolder))
                        Directory.CreateDirectory(StiMainReportFolder);
                    MainReport.Compile(StiMainReportCompiledReportFile);
                    
                    MainReport = Stimulsoft.Report.StiReport.GetReportFromAssembly(StiMainReportCompiledReportFile, true);
                    MainReport.RegData(DSProtocol_Table);
                }
                MainReport.Collate = 4;
                MainReport.Render(false);
                MainReport.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, String.Concat(folder_name, "\\", file_name, ".pdf"), settings);
Получается что после компиляции я принудительно загружаю из Assembly, и только тогда работает.
Но все равно, как мне кажется, тут что-то не то. Может будут еще какие идеи?
Aleksey
Сообщения: 2907
Зарегистрирован: 22 апр 2010, 06:57

Re: Увеличение объема занимаемой ОЗУ

Сообщение Aleksey »

Здравствуйте,

Пожалуйста, попробуйте вместо:

Код: Выделить всё

MainReport.Compile(StiMainReportCompiledReportFile);
MainReport = Stimulsoft.Report.StiReport.GetReportFromAssembly(StiMainReportCompiledReportFile, true);
использовать следующий код:

Код: Выделить всё

MainReport.Compile(StiMainReportCompiledReportFile);
MainReport = MainReport.CompiledReport;
Спасибо.
walle93
Сообщения: 21
Зарегистрирован: 02 июл 2013, 22:25

Re: Увеличение объема занимаемой ОЗУ

Сообщение walle93 »

Теперь буду отслеживать ОЗУ. Но все равно уже положительные сдвиги есть. Спасибо за помощь!
Ответить