powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечка памяти при работе с DataSet
19 сообщений из 69, страница 3 из 3
Утечка памяти при работе с 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
19 сообщений из 69, страница 3 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Утечка памяти при работе с DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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