растет память

Обсуждение Stimulsoft Reports.NET
Ответить
mihanik11
Сообщения: 4
Зарегистрирован: 06 авг 2009, 08:02
Откуда: Krsk

растет память

Сообщение mihanik11 »

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

Программно вызываю на просмотр один и тот же шаблон на разных данных:

public void ShowRenderedReport(DataSet ds)
{
if (stiReport == null)
{
stiReport = CreateStiReport();
stiReport.Load("bla-bla.mrt");
stiReport.Compile();
}
stiReport.Dictionary.DataSources.Clear();
stiReport.Dictionary.DataStore.Clear();
stiReport.RegData("data", ds);
stiReport.Dictionary.Synchronize();
stiReport.Render();

stiReport.Show(true);

stiReport.Dictionary.DataSources.Clear();
stiReport.Dictionary.DataStore.Clear();
stiReport.RenderedPages.Clear();
}

Проблема в том, что с каждым вызовом память используемая программой увеличивается

версия SR 2008.2.300
версия VS 2005
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

растет память

Сообщение Jan »

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

Почитайте пожалуйста вот этот топик на форуме:

http://forum.stimulsoft.com/Default.aspx?g=posts&t=142

Там описано почему так происходит и как с этим бороться.

Спасибо.
mihanik11
Сообщения: 4
Зарегистрирован: 06 авг 2009, 08:02
Откуда: Krsk

растет память

Сообщение mihanik11 »

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

Хотите сказать, что откомпилированный отчет нельзя оставлять в памяти?
Его надо обязательно разрушать и вновь загружать из бинарника при каждом просчете?

Но это же бред. Время на выделение памяти, на загрузку отчета, впустую гонять GC.
Может быть разработчику стоит внимательно посмотреть куда девается память?

Я почему оставляю отчет в памяти - мне критично время подготовки отчета.
На слабеньких компах это чувствительно.

Спасибо
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

растет память

Сообщение Jan »

Здравствуйте,
Хотите сказать, что откомпилированный отчет нельзя оставлять в памяти?
Можно конечно. Но галвное потом не вызывать повторно компиляцию.
Его надо обязательно разрушать и вновь загружать из бинарника при каждом просчете?
Привидите пожалуйста код метода CreateStiReport.

Но это же бред. Время на выделение памяти, на загрузку отчета, впустую гонять GC.
Может быть разработчику стоит внимательно посмотреть куда девается память?

Я почему оставляю отчет в памяти - мне критично время подготовки отчета.
На слабеньких компах это чувствительно.
Саиый быстрый способ это использование отчетов в виде классов c# или VB.Net.

Спасибо.
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

растет память

Сообщение Jan »

Здравствуйте,
mihanik11 писал(а): Программно вызываю на просмотр один и тот же шаблон на разных данных:

public void ShowRenderedReport(DataSet ds)
{
if (stiReport == null)
{
stiReport = CreateStiReport();
stiReport.Load("bla-bla.mrt");
stiReport.Compile();
}
stiReport.Dictionary.DataSources.Clear();
stiReport.Dictionary.DataStore.Clear();
stiReport.RegData("data", ds);
stiReport.Dictionary.Synchronize();
stiReport.Render();

stiReport.Show(true);

stiReport.Dictionary.DataSources.Clear();
stiReport.Dictionary.DataStore.Clear();
stiReport.RenderedPages.Clear();
}
P.S. Некоторые строчки код здесь лишние. Не имеет смысла делать

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

stiReport.Dictionary.DataSources.Clear(); 
и

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

stiReport.Dictionary.Synchronize();
в скомпилированном отчете, поскольку после компиляции отчета, все источники данных превращены в объекты. Также вот эту строку

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

stiReport.Dictionary.DataStore.Clear();
нужно заменить на

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

stiReport.Dictionary.DataStore.Clear();
if (stiReport.CompiledReport != null)
 stiReport.CompiledReport.Dictionary.DataStore.Clear();
Спасибо.
mihanik11
Сообщения: 4
Зарегистрирован: 06 авг 2009, 08:02
Откуда: Krsk

растет память

Сообщение mihanik11 »

Привидите пожалуйста код метода CreateStiReport.
Да там ничего особенного нет:

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

        public void CreateStiReport()
        {
            stiReport = new StiReport();
            stiReport.EngineVersion = Stimulsoft.Report.Engine.StiEngineVersion.EngineV2;
            stiReport.ReferencedAssemblies = new string[] { "System.Dll", "System.Drawing.Dll", "System.Windows.Forms.Dll", "System.Data.Dll", "System.Xml.Dll", "Stimulsoft.Controls.Dll", "Stimulsoft.Base.Dll", "Stimulsoft.Report.Dll" };
            stiReport.ReportAlias = "Отчет";
            stiReport.ReportGuid = "a5787ba193414e2e9cb05b3da95d4783";
            stiReport.ReportName = "Отчет";
            stiReport.ReportSource = null;
            stiReport.ReportUnit = Stimulsoft.Report.StiReportUnitType.Centimeters;
            stiReport.ScriptLanguage = Stimulsoft.Report.StiReportLanguageType.CSharp;
            stiReport.ReportCacheMode = StiReportCacheMode.On;
        }
Похоже помогла эта строчка:
stiReport.CompiledReport.Dictionary.DataStore.Clear();
Спасибо
Ответить