|
|
|
Утечка памяти при работе с 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?fid=58&msg=39565526&tid=2041465]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
149ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
| others: | 227ms |
| total: | 480ms |

| 0 / 0 |
