Страница 1 из 1

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

Добавлено: 06 авг 2009, 08:19
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

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

Добавлено: 06 авг 2009, 13:00
Jan
Здравствуйте,

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

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

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

Спасибо.

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

Добавлено: 07 авг 2009, 00:21
mihanik11
Здравствуйте.

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

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

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

Спасибо

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

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

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

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

Спасибо.

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

Добавлено: 07 авг 2009, 06:26
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();
Спасибо.

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

Добавлено: 07 авг 2009, 08:22
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();
Спасибо