Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
Vladimir779
шК0ДЕР
Добрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный).

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

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

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


Сработало, даже без выгрузки всех данных в грид, очень быстро.
Спасибо всем за советы!
21 ноя 17, 09:18    [20971017]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
чччД
Guest
шК0ДЕР
Vladimir779
пропущено...

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

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

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


Сработало, даже без выгрузки всех данных в грид, очень быстро.
Спасибо всем за советы!

п....ц приплыли.
21 ноя 17, 09:21    [20971022]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2468
шК0ДЕР
Сработало
Функцию эту не смотрел, но она не может не использовать тот же цикл перебора датасета, что и у тебя. А значит, сработало потому, что ты что-то изменил. Список полей в select'е, например.
21 ноя 17, 11:47    [20971604]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
YuRock, и это тоже. Половину неиспользуемых исключил
21 ноя 17, 11:51    [20971631]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 2468
шК0ДЕР
Половину неиспользуемых исключил

Именно это помогло.
21 ноя 17, 14:20    [20972221]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2091
потом записей станет больше и всё вернётся на круги. и так будет, пока нормально не сделаешь.
22 ноя 17, 16:02    [20975575]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
В общем решил проблему используя TOracleQuery, которому не нужно хранить в памяти весь набор данных. Отказался от стандартной выгрузки из грида с помощью функции ExportDBGridEhToXlsx, т.к она лажевая (Но быстрая). Никакого форматирования, при наличии большого кол-ва полей все сливается.

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

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

Буду думать, как переписать компонент заменив DataSet на OracleQuery
6 дек 17, 13:44    [21010783]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
чччД
Guest
шК0ДЕР
в котором как раз и производится подсчет общего кол-ва строк
...
как переписать компонент заменив DataSet на OracleQuery
- заюзать select count() - не, никак?
6 дек 17, 13:52    [21010833]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
schi
Member

Откуда: Москва
Сообщений: 2356
шК0ДЕР
Буду думать, как переписать компонент заменив DataSet на OracleQuery


Сделать обертку (декоратор) и использовать ее внутри компонента.
6 дек 17, 13:54    [21010850]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
Если прочитать дальше, то найдете это
шК0ДЕР
Получение кол-ва строк поправил, манипулируя свойствами DataSet`a
6 дек 17, 13:55    [21010857]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
чччД
Guest
шК0ДЕР
Если прочитать дальше, то найдете это
шК0ДЕР
Получение кол-ва строк поправил, манипулируя свойствами DataSet`a

Поделись же, чем ты манипулировал.
6 дек 17, 13:59    [21010882]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
чччД,

20968478
6 дек 17, 14:08    [21010942]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
чччД
Guest
шК0ДЕР
чччД,

20968478

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


А ты смотрел в исходниках, как высчитывается ReсordCount при включенном CountAllRecords? Загрузкой всего датасета или отдельным запросом к серверу?
6 дек 17, 14:13    [21010973]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
чччД,

не смотрел, но работает очень даже шустро, не похоже, чтобы весь датасет грузил
6 дек 17, 14:23    [21011030]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
defecator
Member

Откуда:
Сообщений: 35495
чччД
шК0ДЕР
чччД,

20968478

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


А ты смотрел в исходниках, как высчитывается ReсordCount при включенном CountAllRecords? Загрузкой всего датасета или отдельным запросом к серверу?

в DOA делается отдельный запрос
Select count(1) from (текст основного запроса)
6 дек 17, 14:25    [21011039]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
чччД
Guest
defecator,
понял, спасибо.
6 дек 17, 14:26    [21011048]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
schi
шК0ДЕР
Буду думать, как переписать компонент заменив DataSet на OracleQuery


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


А можно поподробней?
Гугл подсказал: "Язык Delphi поддерживает class helpers, которые делают ненужным использование шаблона декоратор"
6 дек 17, 14:30    [21011078]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
schi
Member

Откуда: Москва
Сообщений: 2356
шК0ДЕР,

Как-то так:

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
6 дек 17, 21:01    [21012744]     Ответить | Цитировать Сообщить модератору
 Re: Утечка памяти при работе с DataSet  [new]
шК0ДЕР
Member

Откуда: Сызрань, городок на Волге
Сообщений: 71
schi, спасибо
7 дек 17, 08:26    [21013465]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3]      все
Все форумы / Delphi Ответить