powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечка памяти при работе с DataSet
69 сообщений из 69, показаны все 3 страниц
Утечка памяти при работе с DataSet
    #39555982
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный). Для этого нужно знать общее кол-во записей в датасете, которое узнаю с помощью следующей процедуры
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure GetDataSetRows;
var
  bm: TBookmark;
begin
  with FDataSet do
  begin
    DisableControls;
    bm := GetBookmark;
    First;
    FDataSetRows := 0;
    While not Eof do
    begin
      Inc(FDataSetRows);
      Next;
    end;
    GotoBookmark(bm);
    FreeBookmark(bm);
    EnableControls;
  end;
end;


Проблема возникает в цикле,
Код: pascal
1.
2.
3.
4.
5.
While not Eof do
    begin
      Inc(FDataSetRows);
      Next;
    end;

приложение съедает память до 1 гб (когда FDataSetRows инкрементируется до ~40к) и завершает работу с ошибкой "Out of memory". Если записей в датасете немного, то все работает без ошибок.

Подскажите, как можно исправить утечку или посчитать кол-во записей в датасете?
Вариант с возвращением кол-ва записей в запросе с сервера не лучший, т.к процедура по печати отчетов универсальная, а запросов для этих самых отчетов больше тысячи, накладно все их дописывать
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39555983
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

Это не утечка, а просто не хватает памяти для такого огромного буффера.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39555985
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

Выход один:
1. Для получения каунта использовать отдельно select count(*) from;
2. В отчет выводить постранично (скажем, по 1000 записей). (что-то типа select first 1000 step 5000)
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39555987
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Этого то я и боялся...
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39555989
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя подожди... При
шК0ДЕРFetchAll := False
Такого может и не должно быть. Может действительно утечка в компонентах доступа или еще где?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39555992
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже странным показалось, компоненты проверил, вроде чисто. Смотрел при отладке в диспетчере задач, память утекает именно при переборе записей датасета. В Locate() кстати та же проблема.
Пытался решить вот чем:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
DBGrid.DataSource.DataSet := nil;
While not Eof do
begin
   Inc(FDataSetRows);
   Next;
end;
DBGrid.DataSource.DataSet := FDataSet;


Код: pascal
1.
2.
3.
4.
5.
6.
7.
DBGrid.DataSource.Enabled := False;
While not Eof do
begin
   Inc(FDataSetRows);
   Next;
end;
DBGrid.DataSource.Enabled := True;


заменяя цикл на
Код: pascal
1.
2.
Last;
FDataSetRows := RecNo;


Для эксперемента прописал Refresh в цикле, память, потребляемая приложением сбрасывается до обычной - 8к.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39555994
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРзаменяя цикл на
Код: pascal
1.
2.
Last;
FDataSetRows := RecNo;

Если в твоих компонентах работает RecNo после Last, зачем проктология с циклом тогда.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556002
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, код не мой. В любом случае при выполнении метода Last(который так и не выполняется до конца) происходит та же котовасия с памятью. Компонент TOracleDataSet, DOA
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556008
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

Может это компонент и не умеет при отключенном FetchAll буффер определенного размера только помнить.
А с другой стороны, вряд ли такое возможно. Ведь всегда должны быть возможны Prev или First. А как такое сделать на уровне базы? Наверно никак. Unfetch какой-нибудь если и есть где-то, то не везде и не всегда может сработать.
Т.ч. Только переделывать.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556028
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, разобрался как кол-во строк подсчитывалось. В компоненте было отключено свойство CountAllRecords и ReсordCount возвращал кол-во видимых записей из грида. При включенному свойстве возвращается общее кол-во записей.
Но проблема осталась. При самой печати данных происходит перебор записей датасета. Отчет недоформировывается
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556031
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это нормальное, обычное поведение. Наборы данных обычно держат все данные в памяти. Вот представьте - что всю выборку из базы всунули в память + обвязка (т.к данные в памяти не в raw же хранить).

авторВедь всегда должны быть возможны Prev или First.

Проблема даже не в Prev/First, как раз таки Prev/First сделать не проблема. Проблема в том, что вся выборка может понадобится для отображения в гриде и как тогда по-другому сделать? Кроме как тащить весь набор в память.

Код: pascal
1.
2.
3.
4.
5.
While not Eof do
    begin
      Inc(FDataSetRows);
      Next;
    end;



Это тоже самое, что FetchAll, это FetchAll и есть.

авторПодскажите, как можно исправить утечку или посчитать кол-во записей в датасете?

1. Это не утечка памяти. Это обычная, нормальная работа. Наборы именно так и работают.
2. Если не нужно отображать данные в гриде, то можно взять набор, который не тащит все данные в память, а выбирает только текущую запись. В случае IBX, например, это TIBSQL. В других наборах компонент может быть по-разному: от отдельной компоненты до опций в пределах одной.
3. Намного лучше вместо того, что бы считать количество записей на клиенте посчитать их сервером, отдав ему соответствующий запрос (select count(some_field) as counter from database).
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556034
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4. Если же нужно отображать набор в гриде - то либо ограничивать количество записей в наборе, либо переходить на 64х.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556039
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon, с кол-вом записей уже разобрался. Проблема теперь при печати отчета. Хотя способ аналогичен...
Код: pascal
1.
2.
3.
4.
5.
While not DataSet.Eof do
begin
   //печать данных
   Next;
end;

Есть еще какие-либо идеи кроме печати данных по частям?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556050
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

авторпереходить на 64х
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556053
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделать отдельный набор именно для печати, как я говорил:
"можно взять набор, который не тащит все данные в память, а выбирает только текущую запись. В случае IBX, например, это TIBSQL"
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556075
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРmakhaon, с кол-вом записей уже разобрался. Проблема теперь при печати отчета. Хотя способ аналогичен...
Код: pascal
1.
2.
3.
4.
5.
While not DataSet.Eof do
begin
   //печать данных
   Next;
end;

Есть еще какие-либо идеи кроме печати данных по частям?

Использовать unidirectional dataset, например
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556107
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то чтобы зачитать весь ДС (кот. зачитан не целиком), достаточно стать в его конец (last), в потом вернуться.
Тогда станет известно кол-во записей. И можно начинать экспорт.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556110
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LSVВообще-то чтобы зачитать весь ДС (кот. зачитан не целиком), достаточно стать в его конец (last), в потом вернуться.
Тогда станет известно кол-во записей. И можно начинать экспорт.

Попробуй на больших объемах, тебе понравится.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556140
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiИспользовать unidirectional dataset, напримерИли вообще не датасет. Что-то типа TIBSQL
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556154
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Будь я твоим руководителем, я бы заставил тебя пролистать все 100к строк
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556200
LSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiLSVВообще-то чтобы зачитать весь ДС (кот. зачитан не целиком), достаточно стать в его конец (last), в потом вернуться.
Тогда станет известно кол-во записей. И можно начинать экспорт.

Попробуй на больших объемах, тебе понравится.А то я не пробовал... :)
Все равно это придется грузить, чтобы экспортировать. Объем вычислений будет одинаковым.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556205
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Может это компонент и не умеет при отключенном FetchAll буффер определенного размера только помнить.
А с другой стороны, вряд ли такое возможно. Ведь всегда должны быть возможны Prev или First. А как такое сделать на уровне базы? Наверно никак. Unfetch какой-нибудь если и есть где-то, то не везде и не всегда может сработать.
Т.ч. Только переделывать.

Без привязки к конкретному вопросу вставлю свои 5 копеек - есть такая штука как TIB_Cursor (библиотека IBObjects) - там буфер выделяется ровно на одну запись из БД и сам TIB_Cursor умеет только Next(). Самое то для ТС, если найдутся аналоги.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556218
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там в этой базе файлы в блобах хранятся что ли? Как-то многова-то веса (аж гигабайт) для всего 40к строчек.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556277
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiТам в этой базе файлы в блобах хранятся что ли? Как-то многова-то веса (аж гигабайт) для всего 40к строчек.Блобы как раз не тянутся. Может, строки длинные
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556278
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может и SELECT* убрать можно и поможет.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556308
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРДобрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный).
Возможно, отвечаю не совсем по заданному вопросу
Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib
следует использовать модуль DBGridEhImpExp
Код: pascal
1.
2.
uses
DBGridEhImpExp


и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода
Код: pascal
1.
ExportDBGridEhToXlsx(DBGridEh1, 'Тут нужно указать имя файла Excel',[]);


у меня по крайней мере работает и на бОльших данных
использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021"
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556320
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonкак раз таки Prev/First сделать не проблемаИнтересно, как, не храня буффер предыдущей записи на клиенте, когда на сервере её уже нет.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556325
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779, на рабочей форме пользователя такое кол-во позиций явно будет лишним. Придется в момент печати выводить в грид все позиции, а после печати обратно скрыть лишнюю тонну данных. Завтра обязательно попробую. Интересно на сколько быстро будет весь объем в грид выгружаться, т.к событие OnDrawDataCell обрабатывается. Код небольшой, но все же...
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556329
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779шК0ДЕРДобрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный).
Возможно, отвечаю не совсем по заданному вопросу
Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib
следует использовать модуль DBGridEhImpExp
Код: pascal
1.
2.
uses
DBGridEhImpExp


и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода
Код: pascal
1.
ExportDBGridEhToXlsx(DBGridEh1, 'Тут нужно указать имя файла Excel',[]);


у меня по крайней мере работает и на бОльших данных
использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021"
Совсем обалдели. В грид-то - зачем грузить?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556335
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР...Имеется функционал по выводу данных из грида в эксель(самописный). Для этого нужно знать общее кол-во записей в датасете...
Расскажи, пожалуйста - для чего тебе при выводе в эксель знать общее количество записей в датасете?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556339
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

для того что бы содержимое грида выгрузить в Эксель
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556344
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРVladimir779, на рабочей форме пользователя такое кол-во позиций явно будет лишним. Придется в момент печати выводить в грид все позиции, а после печати обратно скрыть лишнюю тонну данных. Завтра обязательно попробую. Интересно на сколько быстро будет весь объем в грид выгружаться, т.к событие OnDrawDataCell обрабатывается. Код небольшой, но все же...

Попробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556348
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДзнать общее количество записей в датасете?Vladimir779что бы содержимое грида выгрузить в Эксельне вижу взимосвязи
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556358
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779шК0ДЕРVladimir779, на рабочей форме пользователя такое кол-во позиций явно будет лишним. Придется в момент печати выводить в грид все позиции, а после печати обратно скрыть лишнюю тонну данных. Завтра обязательно попробую. Интересно на сколько быстро будет весь объем в грид выгружаться, т.к событие OnDrawDataCell обрабатывается. Код небольшой, но все же...

Попробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell

Это троллинг такой, что ли?
Или просто альтернативно одаренные общаются?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556360
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДПопробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell

Это троллинг такой, что ли?
Или просто альтернативно одаренные общаются?[/quot]

Ну как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556362
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Что-то цитирование съехало напрочь :(
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556363
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterНу как это зачем? Чтобы побольше граблей в темной комнате раскидать
Не только, а чтобы еще в 2 раза более правильным казалось, для самоутверждения, решение перейти на 64 бита.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556369
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_чччДзнать общее количество записей в датасете?Vladimir779что бы содержимое грида выгрузить в Эксельне вижу взимосвязи
я изначально указал "Возможно, отвечаю не совсем по заданному вопросу"
именно поэтому не видно никакой взаиомосвязи
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556370
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterчччДПопробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell
Это троллинг такой, что ли?
Или просто альтернативно одаренные общаются?
Ну как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться.[/quot]
Критиковать все могут, а можешь предложить рабочий вариант, и что бы без граблей ?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556371
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterНу как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться.
Критиковать все могут, а можешь предложить рабочий вариант, и что бы без граблей ?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556380
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779DarkMasterНу как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться.
Критиковать все могут, а можешь предложить рабочий вариант, и что бы без граблей ?
Ну, напрягись чуть-чуть.
Подсказки:
1. Задумайся по поводу: "а для чего грузить весь датасет в память, если экспорт в MS Excel все равно выполняется построчно?"
2. И тем более - для чего к этоve несчастному датасету подключать TDBGridEh, если ты вообще не собираешься этот грид показывать.
3. Посмотри на реализацию класса TDBGridEhExportAsXLS - там комментария больше, чем кода. А полезного кода - пара десятков строк всего.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556434
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779,

Так я же уже всё расписал :) Если отображать в гриде не нужно, то незачем тащить набор в память. Если нужно, то нужно либо 64х, либо ограничивать размер выборки. Считать количество компонентой тоже не нужно, а запросом. Даже запрос написал :)

makhaonкак раз таки Prev/First сделать не проблема
YuRock Интересно, как, не храня буффер предыдущей записи на клиенте, когда на сервере её уже нет.

Да, точно, набор однонаправленный же. Неверно написал.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556436
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой сомневаюсь что пользователю понравится файл с 100к строк.

Посадить бы дарование, чтобы написал формулу в полученном Экселе для умножения суммы 1,3,5,7,9 стоки на разнность в 2,4,6,8,10, в каждом чётном десятке. По всем 100к строчкам.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556443
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrОй сомневаюсь что пользователю понравится файл с 100к строк.

Посадить бы дарование, чтобы написал формулу в полученном Экселе для умножения суммы 1,3,5,7,9 стоки на разнность в 2,4,6,8,10, в каждом чётном десятке. По всем 100к строчкам.
Мы недавно задание специальное выполняли, по реализации отчета несуразных размеров и структуры. Уж что там заказчик собирается с ним делать - не наша забота.
Возможно, он его (за неделю, не быстрее) распечатает, украсит подписями и печатями, погрузит на грузовики и отвезет в глубокий подземный бункер.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556465
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrОй сомневаюсь что пользователю понравится файл с 100к строк.Был у меня случай, когда клиент возмутился тем, что в отчет в экселе попадают только первые 65535 строк. Вот тогда и пришлось на xlsx переходить)
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556482
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А некоторые по миллиону в Лукап пихают
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556494
Dunkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
makhaonЕсли нужно, то нужно либо 64х, либо ограничивать размер выборки. Считать количество компонентой тоже не нужно, а запросом. Даже запрос написал :)
64 бита не решат проблему времени при загрузке данных в датасет. Компонент тоже специфический и как раз выполняет select count(*) в CountAllRecords.

Как уже написали, грузить всё не нужно.
У TOracleDataSet есть свойство UniDirectional. Но лучше использовать TOracleQuery.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556514
Vladimir779
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНу, напрягись чуть-чуть.
Подсказки:
1. Задумайся по поводу: "а для чего грузить весь датасет в память, если экспорт в MS Excel все равно выполняется построчно?"
2. И тем более - для чего к этоve несчастному датасету подключать TDBGridEh, если ты вообще не собираешься этот грид показывать.
3. Посмотри на реализацию класса TDBGridEhExportAsXLS - там комментария больше, чем кода. А полезного кода - пара десятков строк всего.
Возможно, я чего-то недопонимаю, благодарю за наводку, в свободное время рассмотрю каждый пункт
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556526
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrОй сомневаюсь что пользователю понравится файл с 100к строк.
Это справочники товара и прайс листы, пользователям(финансистам, маркетологам) именно НУЖНО, в противном случае и тему не завел бы.
DimaBrПосадить бы дарование, чтобы написал формулу в полученном Экселе для умножения суммы 1,3,5,7,9 стоки на разнность в 2,4,6,8,10, в каждом чётном десятке. По всем 100к строчкам.
Никакие вычисления там не требуются, а если бы и требовались, то производились исключительно на сервере...
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556563
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779чччДНу, напрягись чуть-чуть.
Подсказки:
1. Задумайся по поводу: "а для чего грузить весь датасет в память, если экспорт в MS Excel все равно выполняется построчно?"
2. И тем более - для чего к этоve несчастному датасету подключать TDBGridEh, если ты вообще не собираешься этот грид показывать.
3. Посмотри на реализацию класса TDBGridEhExportAsXLS - там комментария больше, чем кода. А полезного кода - пара десятков строк всего.
Возможно, я чего-то недопонимаю, благодарю за наводку, в свободное время рассмотрю каждый пункт
Ну да, думать некогда... трясти надо...
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556564
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir779шК0ДЕРДобрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный).
Возможно, отвечаю не совсем по заданному вопросу
Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib
следует использовать модуль DBGridEhImpExp
Код: pascal
1.
2.
uses
DBGridEhImpExp


и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода
Код: pascal
1.
ExportDBGridEhToXlsx(DBGridEh1, 'Тут нужно указать имя файла Excel',[]);


у меня по крайней мере работает и на бОльших данных
использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021"

Сработало, даже без выгрузки всех данных в грид, очень быстро.
Спасибо всем за советы!
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556566
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРVladimir779пропущено...

Возможно, отвечаю не совсем по заданному вопросу
Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib
следует использовать модуль DBGridEhImpExp
Код: pascal
1.
2.
uses
DBGridEhImpExp


и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода
Код: pascal
1.
ExportDBGridEhToXlsx(DBGridEh1, 'Тут нужно указать имя файла Excel',[]);


у меня по крайней мере работает и на бОльших данных
использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021"

Сработало, даже без выгрузки всех данных в грид, очень быстро.
Спасибо всем за советы!
п....ц приплыли.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556671
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРСработалоФункцию эту не смотрел, но она не может не использовать тот же цикл перебора датасета, что и у тебя. А значит, сработало потому, что ты что-то изменил. Список полей в select'е, например.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556674
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock, и это тоже. Половину неиспользуемых исключил
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39556862
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРПоловину неиспользуемых исключил
Именно это помогло.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39557629
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потом записей станет больше и всё вернётся на круги. и так будет, пока нормально не сделаешь.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565037
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем решил проблему используя TOracleQuery, которому не нужно хранить в памяти весь набор данных. Отказался от стандартной выгрузки из грида с помощью функции ExportDBGridEhToXlsx, т.к она лажевая (Но быстрая). Никакого форматирования, при наличии большого кол-ва полей все сливается.

Проекту 15 лет, для выгрузки данных в эксель используется самописный компонент(мощная универсальная штука), в котором как раз и производится подсчет общего кол-ва строк(для последующего выделения диапазона ячеек и вставки в него данных), затем все данные заносятся в многомерный массив(видимо разрабы не рассчитывали на большое кол-во данных). Получение кол-ва строк поправил, манипулируя свойствами DataSet`a, а вот при занесении данных в массив происходит та же лажа - Out of memory.

Временно сделал корявую обработку, т.к. пользователи беснуются:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
try
   //занесение данных в массив
except
  on E:Exception do
     if Pos('out of memory', LowerCase(E.Message)) > 0  then
     //Вызов процедуры, в которой данные возвращаются с помощью TOracleQuery с последующей печатью(без массивов) 
end;


Буду думать, как переписать компонент заменив DataSet на OracleQuery
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565047
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРв котором как раз и производится подсчет общего кол-ва строк
...
как переписать компонент заменив DataSet на OracleQuery - заюзать select count() - не, никак?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565051
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРБуду думать, как переписать компонент заменив DataSet на OracleQuery

Сделать обертку (декоратор) и использовать ее внутри компонента.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565053
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если прочитать дальше, то найдете это шК0ДЕРПолучение кол-ва строк поправил, манипулируя свойствами DataSet`a
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565055
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРЕсли прочитать дальше, то найдете это шК0ДЕРПолучение кол-ва строк поправил, манипулируя свойствами DataSet`a
Поделись же, чем ты манипулировал.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565066
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

20968478
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565074
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕРчччД,

20968478
шК0ДЕРYuRock, разобрался как кол-во строк подсчитывалось. В компоненте было отключено свойство CountAllRecords и ReсordCount возвращал кол-во видимых записей из грида. При включенному свойстве возвращается общее кол-во записей.
Но проблема осталась. При самой печати данных происходит перебор записей датасета. Отчет недоформировывается

А ты смотрел в исходниках, как высчитывается ReсordCount при включенном CountAllRecords? Загрузкой всего датасета или отдельным запросом к серверу?
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565087
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

не смотрел, но работает очень даже шустро, не похоже, чтобы весь датасет грузил
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565089
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
чччДшК0ДЕРчччД,

20968478
шК0ДЕРYuRock, разобрался как кол-во строк подсчитывалось. В компоненте было отключено свойство CountAllRecords и ReсordCount возвращал кол-во видимых записей из грида. При включенному свойстве возвращается общее кол-во записей.
Но проблема осталась. При самой печати данных происходит перебор записей датасета. Отчет недоформировывается

А ты смотрел в исходниках, как высчитывается ReсordCount при включенном CountAllRecords? Загрузкой всего датасета или отдельным запросом к серверу?
в DOA делается отдельный запрос
Select count(1) from (текст основного запроса)
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565091
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,
понял, спасибо.
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565096
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiшК0ДЕРБуду думать, как переписать компонент заменив DataSet на OracleQuery

Сделать обертку (декоратор) и использовать ее внутри компонента.

А можно поподробней?
Гугл подсказал: "Язык Delphi поддерживает class helpers, которые делают ненужным использование шаблона декоратор"
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565421
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
шК0ДЕР,

Как-то так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  IDataSetDecorator = interface
    ['{3D9E4FE7-837C-4004-9822-30A604EF424B}']
    function FieldByName(const AName: WideString): TField;
    function GetFields: TFields;
    function GetRecordCount: Integer;
    function GetName: string;
    function ExecSQLAndFetch: Boolean;
    function Fetch: Boolean;
    property Fields: TFields read GetFields;
    property RecordCount: Integer read GetRecordCount;
    property Name: string read GetName;
  end;



Сама выгрузка в Excel работает с методами этого интерфейса, а среди реализаций есть как с двунаправленным DataSet, так и с однонаправленным самописным доступом к Oracle
...
Рейтинг: 0 / 0
Утечка памяти при работе с DataSet
    #39565526
Фотография шК0ДЕР
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi, спасибо
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечка памяти при работе с DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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