|
|
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Добрый день. К дб гриду (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. Проблема возникает в цикле, Код: pascal 1. 2. 3. 4. 5. приложение съедает память до 1 гб (когда FDataSetRows инкрементируется до ~40к) и завершает работу с ошибкой "Out of memory". Если записей в датасете немного, то все работает без ошибок. Подскажите, как можно исправить утечку или посчитать кол-во записей в датасете? Вариант с возвращением кол-ва записей в запросе с сервера не лучший, т.к процедура по печати отчетов универсальная, а запросов для этих самых отчетов больше тысячи, накладно все их дописывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:36:28 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕР, Это не утечка, а просто не хватает памяти для такого огромного буффера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:42:28 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕР, Выход один: 1. Для получения каунта использовать отдельно select count(*) from; 2. В отчет выводить постранично (скажем, по 1000 записей). (что-то типа select first 1000 step 5000) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:45:17 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Этого то я и боялся... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:46:27 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Хотя подожди... При шК0ДЕРFetchAll := False Такого может и не должно быть. Может действительно утечка в компонентах доступа или еще где? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:48:25 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Тоже странным показалось, компоненты проверил, вроде чисто. Смотрел при отладке в диспетчере задач, память утекает именно при переборе записей датасета. В Locate() кстати та же проблема. Пытался решить вот чем: Код: pascal 1. 2. 3. 4. 5. 6. 7. Код: pascal 1. 2. 3. 4. 5. 6. 7. заменяя цикл на Код: pascal 1. 2. Для эксперемента прописал Refresh в цикле, память, потребляемая приложением сбрасывается до обычной - 8к. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:57:11 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРзаменяя цикл на Код: pascal 1. 2. Если в твоих компонентах работает RecNo после Last, зачем проктология с циклом тогда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 10:59:19 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
YuRock, код не мой. В любом случае при выполнении метода Last(который так и не выполняется до конца) происходит та же котовасия с памятью. Компонент TOracleDataSet, DOA ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:06:01 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕР, Может это компонент и не умеет при отключенном FetchAll буффер определенного размера только помнить. А с другой стороны, вряд ли такое возможно. Ведь всегда должны быть возможны Prev или First. А как такое сделать на уровне базы? Наверно никак. Unfetch какой-нибудь если и есть где-то, то не везде и не всегда может сработать. Т.ч. Только переделывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:14:00 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
YuRock, разобрался как кол-во строк подсчитывалось. В компоненте было отключено свойство CountAllRecords и ReсordCount возвращал кол-во видимых записей из грида. При включенному свойстве возвращается общее кол-во записей. Но проблема осталась. При самой печати данных происходит перебор записей датасета. Отчет недоформировывается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:28:52 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Это нормальное, обычное поведение. Наборы данных обычно держат все данные в памяти. Вот представьте - что всю выборку из базы всунули в память + обвязка (т.к данные в памяти не в raw же хранить). авторВедь всегда должны быть возможны Prev или First. Проблема даже не в Prev/First, как раз таки Prev/First сделать не проблема. Проблема в том, что вся выборка может понадобится для отображения в гриде и как тогда по-другому сделать? Кроме как тащить весь набор в память. Код: pascal 1. 2. 3. 4. 5. Это тоже самое, что FetchAll, это FetchAll и есть. авторПодскажите, как можно исправить утечку или посчитать кол-во записей в датасете? 1. Это не утечка памяти. Это обычная, нормальная работа. Наборы именно так и работают. 2. Если не нужно отображать данные в гриде, то можно взять набор, который не тащит все данные в память, а выбирает только текущую запись. В случае IBX, например, это TIBSQL. В других наборах компонент может быть по-разному: от отдельной компоненты до опций в пределах одной. 3. Намного лучше вместо того, что бы считать количество записей на клиенте посчитать их сервером, отдав ему соответствующий запрос (select count(some_field) as counter from database). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:32:53 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
4. Если же нужно отображать набор в гриде - то либо ограничивать количество записей в наборе, либо переходить на 64х. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:35:13 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
makhaon, с кол-вом записей уже разобрался. Проблема теперь при печати отчета. Хотя способ аналогичен... Код: pascal 1. 2. 3. 4. 5. Есть еще какие-либо идеи кроме печати данных по частям? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:40:36 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕР, авторпереходить на 64х ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:53:11 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
сделать отдельный набор именно для печати, как я говорил: "можно взять набор, который не тащит все данные в память, а выбирает только текущую запись. В случае IBX, например, это TIBSQL" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 11:56:59 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРmakhaon, с кол-вом записей уже разобрался. Проблема теперь при печати отчета. Хотя способ аналогичен... Код: pascal 1. 2. 3. 4. 5. Есть еще какие-либо идеи кроме печати данных по частям? Использовать unidirectional dataset, например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 12:20:38 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Вообще-то чтобы зачитать весь ДС (кот. зачитан не целиком), достаточно стать в его конец (last), в потом вернуться. Тогда станет известно кол-во записей. И можно начинать экспорт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:01:20 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
LSVВообще-то чтобы зачитать весь ДС (кот. зачитан не целиком), достаточно стать в его конец (last), в потом вернуться. Тогда станет известно кол-во записей. И можно начинать экспорт. Попробуй на больших объемах, тебе понравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:04:37 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
schiИспользовать unidirectional dataset, напримерИли вообще не датасет. Что-то типа TIBSQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:31:17 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Будь я твоим руководителем, я бы заставил тебя пролистать все 100к строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 13:46:29 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
schiLSVВообще-то чтобы зачитать весь ДС (кот. зачитан не целиком), достаточно стать в его конец (last), в потом вернуться. Тогда станет известно кол-во записей. И можно начинать экспорт. Попробуй на больших объемах, тебе понравится.А то я не пробовал... :) Все равно это придется грузить, чтобы экспортировать. Объем вычислений будет одинаковым. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 14:44:38 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
YuRock Может это компонент и не умеет при отключенном FetchAll буффер определенного размера только помнить. А с другой стороны, вряд ли такое возможно. Ведь всегда должны быть возможны Prev или First. А как такое сделать на уровне базы? Наверно никак. Unfetch какой-нибудь если и есть где-то, то не везде и не всегда может сработать. Т.ч. Только переделывать. Без привязки к конкретному вопросу вставлю свои 5 копеек - есть такая штука как TIB_Cursor (библиотека IBObjects) - там буфер выделяется ровно на одну запись из БД и сам TIB_Cursor умеет только Next(). Самое то для ТС, если найдутся аналоги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 14:52:39 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Там в этой базе файлы в блобах хранятся что ли? Как-то многова-то веса (аж гигабайт) для всего 40к строчек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 15:02:59 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
JaDiТам в этой базе файлы в блобах хранятся что ли? Как-то многова-то веса (аж гигабайт) для всего 40к строчек.Блобы как раз не тянутся. Может, строки длинные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 16:00:26 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
А может и SELECT* убрать можно и поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 16:01:21 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРДобрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный). Возможно, отвечаю не совсем по заданному вопросу Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib следует использовать модуль DBGridEhImpExp Код: pascal 1. 2. и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода Код: pascal 1. у меня по крайней мере работает и на бОльших данных использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 16:39:39 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
makhaonкак раз таки Prev/First сделать не проблемаИнтересно, как, не храня буффер предыдущей записи на клиенте, когда на сервере её уже нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 16:50:24 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779, на рабочей форме пользователя такое кол-во позиций явно будет лишним. Придется в момент печати выводить в грид все позиции, а после печати обратно скрыть лишнюю тонну данных. Завтра обязательно попробую. Интересно на сколько быстро будет весь объем в грид выгружаться, т.к событие OnDrawDataCell обрабатывается. Код небольшой, но все же... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 17:05:19 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779шК0ДЕРДобрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный). Возможно, отвечаю не совсем по заданному вопросу Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib следует использовать модуль DBGridEhImpExp Код: pascal 1. 2. и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода Код: pascal 1. у меня по крайней мере работает и на бОльших данных использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021" Совсем обалдели. В грид-то - зачем грузить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 17:08:51 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕР...Имеется функционал по выводу данных из грида в эксель(самописный). Для этого нужно знать общее кол-во записей в датасете... Расскажи, пожалуйста - для чего тебе при выводе в эксель знать общее количество записей в датасете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 17:25:50 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччД, для того что бы содержимое грида выгрузить в Эксель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 17:45:00 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРVladimir779, на рабочей форме пользователя такое кол-во позиций явно будет лишним. Придется в момент печати выводить в грид все позиции, а после печати обратно скрыть лишнюю тонну данных. Завтра обязательно попробую. Интересно на сколько быстро будет весь объем в грид выгружаться, т.к событие OnDrawDataCell обрабатывается. Код небольшой, но все же... Попробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 17:48:53 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччДзнать общее количество записей в датасете?Vladimir779что бы содержимое грида выгрузить в Эксельне вижу взимосвязи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 18:09:12 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779шК0ДЕРVladimir779, на рабочей форме пользователя такое кол-во позиций явно будет лишним. Придется в момент печати выводить в грид все позиции, а после печати обратно скрыть лишнюю тонну данных. Завтра обязательно попробую. Интересно на сколько быстро будет весь объем в грид выгружаться, т.к событие OnDrawDataCell обрабатывается. Код небольшой, но все же... Попробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell Это троллинг такой, что ли? Или просто альтернативно одаренные общаются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 18:43:04 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччДПопробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell Это троллинг такой, что ли? Или просто альтернативно одаренные общаются?[/quot] Ну как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 18:56:15 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччД, Что-то цитирование съехало напрочь :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 18:56:50 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
DarkMasterНу как это зачем? Чтобы побольше граблей в темной комнате раскидать Не только, а чтобы еще в 2 раза более правильным казалось, для самоутверждения, решение перейти на 64 бита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 18:58:51 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_чччДзнать общее количество записей в датасете?Vladimir779что бы содержимое грида выгрузить в Эксельне вижу взимосвязи я изначально указал "Возможно, отвечаю не совсем по заданному вопросу" именно поэтому не видно никакой взаиомосвязи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 19:30:03 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
DarkMasterчччДПопробуй вариант со скрытым гридом от глаз пользователя, грид для выгрузки данных в Эксель, в этом гриде можешь не использовать событие OnDrawDataCell Это троллинг такой, что ли? Или просто альтернативно одаренные общаются? Ну как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться.[/quot] Критиковать все могут, а можешь предложить рабочий вариант, и что бы без граблей ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 19:31:38 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
DarkMasterНу как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться. Критиковать все могут, а можешь предложить рабочий вариант, и что бы без граблей ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 19:32:54 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779DarkMasterНу как это зачем? Чтобы побольше граблей в темной комнате раскидать, а потом героически с ними бороться. Критиковать все могут, а можешь предложить рабочий вариант, и что бы без граблей ? Ну, напрягись чуть-чуть. Подсказки: 1. Задумайся по поводу: "а для чего грузить весь датасет в память, если экспорт в MS Excel все равно выполняется построчно?" 2. И тем более - для чего к этоve несчастному датасету подключать TDBGridEh, если ты вообще не собираешься этот грид показывать. 3. Посмотри на реализацию класса TDBGridEhExportAsXLS - там комментария больше, чем кода. А полезного кода - пара десятков строк всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 20:02:50 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779, Так я же уже всё расписал :) Если отображать в гриде не нужно, то незачем тащить набор в память. Если нужно, то нужно либо 64х, либо ограничивать размер выборки. Считать количество компонентой тоже не нужно, а запросом. Даже запрос написал :) makhaonкак раз таки Prev/First сделать не проблема YuRock Интересно, как, не храня буффер предыдущей записи на клиенте, когда на сервере её уже нет. Да, точно, набор однонаправленный же. Неверно написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 22:51:12 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Ой сомневаюсь что пользователю понравится файл с 100к строк. Посадить бы дарование, чтобы написал формулу в полученном Экселе для умножения суммы 1,3,5,7,9 стоки на разнность в 2,4,6,8,10, в каждом чётном десятке. По всем 100к строчкам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 22:55:28 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
DimaBrОй сомневаюсь что пользователю понравится файл с 100к строк. Посадить бы дарование, чтобы написал формулу в полученном Экселе для умножения суммы 1,3,5,7,9 стоки на разнность в 2,4,6,8,10, в каждом чётном десятке. По всем 100к строчкам. Мы недавно задание специальное выполняли, по реализации отчета несуразных размеров и структуры. Уж что там заказчик собирается с ним делать - не наша забота. Возможно, он его (за неделю, не быстрее) распечатает, украсит подписями и печатями, погрузит на грузовики и отвезет в глубокий подземный бункер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 23:03:28 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
DimaBrОй сомневаюсь что пользователю понравится файл с 100к строк.Был у меня случай, когда клиент возмутился тем, что в отчет в экселе попадают только первые 65535 строк. Вот тогда и пришлось на xlsx переходить) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2017, 23:57:05 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
А некоторые по миллиону в Лукап пихают ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 01:26:42 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
makhaonЕсли нужно, то нужно либо 64х, либо ограничивать размер выборки. Считать количество компонентой тоже не нужно, а запросом. Даже запрос написал :) 64 бита не решат проблему времени при загрузке данных в датасет. Компонент тоже специфический и как раз выполняет select count(*) в CountAllRecords. Как уже написали, грузить всё не нужно. У TOracleDataSet есть свойство UniDirectional. Но лучше использовать TOracleQuery. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 02:54:54 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччДНу, напрягись чуть-чуть. Подсказки: 1. Задумайся по поводу: "а для чего грузить весь датасет в память, если экспорт в MS Excel все равно выполняется построчно?" 2. И тем более - для чего к этоve несчастному датасету подключать TDBGridEh, если ты вообще не собираешься этот грид показывать. 3. Посмотри на реализацию класса TDBGridEhExportAsXLS - там комментария больше, чем кода. А полезного кода - пара десятков строк всего. Возможно, я чего-то недопонимаю, благодарю за наводку, в свободное время рассмотрю каждый пункт ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 07:09:46 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
DimaBrОй сомневаюсь что пользователю понравится файл с 100к строк. Это справочники товара и прайс листы, пользователям(финансистам, маркетологам) именно НУЖНО, в противном случае и тему не завел бы. DimaBrПосадить бы дарование, чтобы написал формулу в полученном Экселе для умножения суммы 1,3,5,7,9 стоки на разнность в 2,4,6,8,10, в каждом чётном десятке. По всем 100к строчкам. Никакие вычисления там не требуются, а если бы и требовались, то производились исключительно на сервере... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 08:11:45 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779чччДНу, напрягись чуть-чуть. Подсказки: 1. Задумайся по поводу: "а для чего грузить весь датасет в память, если экспорт в MS Excel все равно выполняется построчно?" 2. И тем более - для чего к этоve несчастному датасету подключать TDBGridEh, если ты вообще не собираешься этот грид показывать. 3. Посмотри на реализацию класса TDBGridEhExportAsXLS - там комментария больше, чем кода. А полезного кода - пара десятков строк всего. Возможно, я чего-то недопонимаю, благодарю за наводку, в свободное время рассмотрю каждый пункт Ну да, думать некогда... трясти надо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:17:45 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Vladimir779шК0ДЕРДобрый день. К дб гриду (TDBGridEh - компонент EhLib 8.0 build 8.0.023) прикручен датасет. FetchAll := False естественно, т.к записей возвращается много, до 100к. Имеется функционал по выводу данных из грида в эксель(самописный). Возможно, отвечаю не совсем по заданному вопросу Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib следует использовать модуль DBGridEhImpExp Код: pascal 1. 2. и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода Код: pascal 1. у меня по крайней мере работает и на бОльших данных использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021" Сработало, даже без выгрузки всех данных в грид, очень быстро. Спасибо всем за советы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:18:16 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРVladimir779пропущено... Возможно, отвечаю не совсем по заданному вопросу Имеет ли смысл выгрузить все данные в грид DBGridEh1 и потом выгрузить все в Excel средствами от EhLib следует использовать модуль DBGridEhImpExp Код: pascal 1. 2. и выгружать данные из таблицы в Excel без всякого гемора - всего лишь одной строчкой кода Код: pascal 1. у меня по крайней мере работает и на бОльших данных использую следующую связку: "Embarcadero® Delphi 10 Seattle Version 23.0.20618.2753" + "компонент EhLib 8.0 build 8.0.021" Сработало, даже без выгрузки всех данных в грид, очень быстро. Спасибо всем за советы! п....ц приплыли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 09:21:36 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРСработалоФункцию эту не смотрел, но она не может не использовать тот же цикл перебора датасета, что и у тебя. А значит, сработало потому, что ты что-то изменил. Список полей в select'е, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 11:47:53 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
YuRock, и это тоже. Половину неиспользуемых исключил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 11:51:52 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРПоловину неиспользуемых исключил Именно это помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2017, 14:20:50 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
потом записей станет больше и всё вернётся на круги. и так будет, пока нормально не сделаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2017, 16:02:45 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
В общем решил проблему используя TOracleQuery, которому не нужно хранить в памяти весь набор данных. Отказался от стандартной выгрузки из грида с помощью функции ExportDBGridEhToXlsx, т.к она лажевая (Но быстрая). Никакого форматирования, при наличии большого кол-ва полей все сливается. Проекту 15 лет, для выгрузки данных в эксель используется самописный компонент(мощная универсальная штука), в котором как раз и производится подсчет общего кол-ва строк(для последующего выделения диапазона ячеек и вставки в него данных), затем все данные заносятся в многомерный массив(видимо разрабы не рассчитывали на большое кол-во данных). Получение кол-ва строк поправил, манипулируя свойствами DataSet`a, а вот при занесении данных в массив происходит та же лажа - Out of memory. Временно сделал корявую обработку, т.к. пользователи беснуются: Код: pascal 1. 2. 3. 4. 5. 6. 7. Буду думать, как переписать компонент заменив DataSet на OracleQuery ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 13:44:15 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРв котором как раз и производится подсчет общего кол-ва строк ... как переписать компонент заменив DataSet на OracleQuery - заюзать select count() - не, никак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 13:52:27 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРБуду думать, как переписать компонент заменив DataSet на OracleQuery Сделать обертку (декоратор) и использовать ее внутри компонента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 13:54:34 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
Если прочитать дальше, то найдете это шК0ДЕРПолучение кол-ва строк поправил, манипулируя свойствами DataSet`a ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 13:55:32 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРЕсли прочитать дальше, то найдете это шК0ДЕРПолучение кол-ва строк поправил, манипулируя свойствами DataSet`a Поделись же, чем ты манипулировал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 13:59:29 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:08:44 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕРчччД, 20968478 шК0ДЕРYuRock, разобрался как кол-во строк подсчитывалось. В компоненте было отключено свойство CountAllRecords и ReсordCount возвращал кол-во видимых записей из грида. При включенному свойстве возвращается общее кол-во записей. Но проблема осталась. При самой печати данных происходит перебор записей датасета. Отчет недоформировывается А ты смотрел в исходниках, как высчитывается ReсordCount при включенном CountAllRecords? Загрузкой всего датасета или отдельным запросом к серверу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:13:13 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччД, не смотрел, но работает очень даже шустро, не похоже, чтобы весь датасет грузил ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:23:28 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
чччДшК0ДЕРчччД, 20968478 шК0ДЕРYuRock, разобрался как кол-во строк подсчитывалось. В компоненте было отключено свойство CountAllRecords и ReсordCount возвращал кол-во видимых записей из грида. При включенному свойстве возвращается общее кол-во записей. Но проблема осталась. При самой печати данных происходит перебор записей датасета. Отчет недоформировывается А ты смотрел в исходниках, как высчитывается ReсordCount при включенном CountAllRecords? Загрузкой всего датасета или отдельным запросом к серверу? в DOA делается отдельный запрос Select count(1) from (текст основного запроса) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:25:13 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
defecator, понял, спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:26:17 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
schiшК0ДЕРБуду думать, как переписать компонент заменив DataSet на OracleQuery Сделать обертку (декоратор) и использовать ее внутри компонента. А можно поподробней? Гугл подсказал: "Язык Delphi поддерживает class helpers, которые делают ненужным использование шаблона декоратор" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 14:30:53 |
|
||
|
Утечка памяти при работе с DataSet
|
|||
|---|---|---|---|
|
#18+
шК0ДЕР, Как-то так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Сама выгрузка в Excel работает с методами этого интерфейса, а среди реализаций есть как с двунаправленным DataSet, так и с однонаправленным самописным доступом к Oracle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2017, 21:01:30 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041465]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
94ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 374ms |

| 0 / 0 |
