Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4 / 10 сообщений из 10, страница 1 из 1
12.11.2014, 13:00
    #38803369
AsusMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
Привет!
Кто использует компоненты xlReport и Delphi XE4-XE7?

Помогите с проблемой утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4 (32/64),
при компиляции того же кода в D7 проблемы не возникает.

У меня утекает память ~ 10% от объема данных. Удобно наблюдать в утилите procexp.

Утечки наблюдал в :
ProcExp , madExpert, FastMM4 - не видят утечек,
AQTime 8 видит утечки, но номера строки не дает (демо и std)

Память утекает в модуле xlEngine в этом цикле:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
while not XLDataSet.Eof do begin
(FBuff as TxlBuffer).GetRecord(Self, FRows);
FRecordCount := FRecordCount + 1;
{$IFDEF XLR_VCL}
(Report as TxlReport).DoOnProgress2(Self as TxlDataSource, FRecordCount);
{$ENDIF}
{$IFDEF XLR_TRIAL}
{$I xlDoRestrict5.inc}
{$ENDIF}
XLDataSet.Next;
Report.CheckBreak;
end;



Если закомментарить строку в function TxlVarBuffer.CheckLimits:

IRange.Value := Formulas;

то утечка прекращается...почти.
...
Рейтинг: 0 / 0
12.11.2014, 14:53
    #38803610
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
AsusManIRange.Value := Formulas;Осталось типы назвать
...
Рейтинг: 0 / 0
12.11.2014, 14:54
    #38803612
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
_Vasilisk_ОсталосьИ области видимости
...
Рейтинг: 0 / 0
12.11.2014, 15:15
    #38803652
AsusMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
_Vasilisk_,


1. IRange: IxlRange;

IxlRange = Excel8G2.Range;

Тип OLEVariant, видимость локальная.

2. Formulas: OLEVariant;

3. TxlVarBuffer = class(TxlBuffer)
private
FBuff: OLEVariant;

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
function TxlVarBuffer.CheckLimits(const Immediately: boolean; Source: TxlExcelDataSource): boolean;
var
  IRange: IxlRange;
  Formulas: OLEVariant;
  i, j: integer ;
begin
  Result := (RowCount >= xlrMaxVarRowCount) or Immediately;
  if Assigned(Source) and Result and (RowCount > 0) and (not _VarIsEmpty(FBuff)) then begin
    if Source.RangeType <> rtRange then
      IRange := InsertBlankRows(Root.IRange.Rows.Count, RowCount, Root.ColCount, Root.ITempSheet, Root.IRange)
    else begin
      IRange := InsertBlankRows2(Root.IRange.Rows.Count, RowCount, Root.ColCount, Root.ITempSheet, Root.IRange, Source.FIUnMergedRows);
    Formulas := VarArrayCreate([1, RowCount, 1, Root.ColCount], varVariant);
    for i := 1 to RowCount do
      for j := 1 to Root.ColCount do
        Formulas[i, j] := FBuff[j, i];
        //IRange.Cells.Item[i, j].Value  := FBuff[j, i]; //лучше но медленно

    IRange.Value := Formulas; // replace IRange.Formula := Formulas (rc1)

    if not Immediately then
      StartBuffer;
  end;
end;

procedure TxlVarBuffer.StartBuffer;
begin
  FBuff := VarArrayCreate([1, Root.ColCount, 1, 1], varVariant)
end;
...
Рейтинг: 0 / 0
03.12.2014, 19:23
    #38824081
AsusMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
AsusMan,

Решил проблему, тема закрыта.
...
Рейтинг: 0 / 0
03.12.2014, 22:01
    #38824208
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
AsusManРешил проблему, тема закрыта.Полностью одобряю подход. Пусть остальные тоже помучаются
...
Рейтинг: 0 / 0
04.12.2014, 10:42
    #38824578
AsusMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
_Vasilisk_AsusManРешил проблему, тема закрыта.Полностью одобряю подход. Пусть остальные тоже помучаются

Если конкретно по утечке, заменил тип:

Код: pascal
1.
2.
3.
4.
5.
function TxlVarBuffer.CheckLimits(const Immediately: boolean; Source: TxlExcelDataSource): boolean;
var
  //IRange: IxlRange;
  IRange: Variant;
...



Не хотел писать, потому как не разобрался, почему регион, как интерфейс, не освобождает память, после ухода за пределы видимости, а Variant освободил.

А так - компоненты мне нравятся, увеличил вариантный буфер с 256 до 2048 для скорости и переделал распределение
памяти - VarArrayRedim(FBuff, RowCount); чтобы не вызывалось для каждой записи, т.е. сразу выделяю весь буфер.

DDE и CSV - не использую, т.к. с Excel 2010 ведут себя нестабильно, особенно в виде сервиса и на серверных ОС, на ядре XP вообще ошибки пачками валяться - Error: System call failed

Иногда на вариантном массиве Excel 2010 выдает такую ошибку, особенно если процессор занят другими процессами на 100%, на Excel 2003 такого не наблюдалось.
Если кто знает как избавится от ошибок Error: System call failed - просьба откликнуться, как с ними бороться?
...
Рейтинг: 0 / 0
10.12.2014, 22:36
    #38830759
AsusMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
авторИногда на вариантном массиве Excel 2010 выдает такую ошибку, особенно если процессор занят другими процессами на 100%, на Excel 2003 такого не наблюдалось.
Если кто знает как избавится от ошибок Error: System call failed - просьба откликнуться, как с ними бороться?

Ошибся малость, после длительных испытаний пришел к выводу, что ошибка " System call failed " почти 100% начинается, когда система начинает активный страничный обмен. т.е. когда несколько активных процессов конкурируют за физическую память.
Еще полезным бывает сделать паузу 1-2 секунды перед закрытием Excel или сохранением в файл.

Все это касается не только данных компонент но и всех программ которые используют COM для работы с Excel 2007 / 2010.

С Excel 2003 такая ошибка возникала крайне редко,
хотя в нем было естественно ограничение на количество строк на листе.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
20.06.2018, 17:04
    #39663183
AsusMan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
Может кому то еще надо:

Если компоненты применяются в сервисе Windows и при использовании антивируса ESET возможна ошибка:

System call failed

Тогда в процедуре:

procedure TxlExcelDataSource.PutRange;

...После

VBACopyFormats(Self, FRows, FHeights, FDeleteSpecialRow, xrgoPreserveRowHeight in Options, xroHideExcel in Report.Options);

... надо поставить задержку в 2 секунды -

sleep(2000);
...
Рейтинг: 0 / 0
20.06.2018, 20:41
    #39663263
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4
Антивирусы - зло. В очередной раз убеждаюсь. Решение не очень. Как вообще в жизни?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечки памяти в компоненте xlReport при компиляции с помощью Delphi XE4 / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]