Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TQuery и память


Grant ©   (2007-02-10 23:59:00) 

Всем привет. Помогите с такой проблеммой.
У меня есть компонент TQuery. Добавляю в него запрос.
Делаю Open и First. Сразу скажу что запрос возвращает 500000 строк. Дальше пишу такой цикл
 while not TQuery.Eof do
 begin
   .......
   Next;
 end;

Так вот в чем проблемма. По мере того как увеличивается проход по циклу, у меня увеличивается занимаемая приложением память. В конечном итоге она доходит до предела и приложение виснет. Пробовал выполнять запрос и не делать прохода по циклу и приложение нормально отрабатывало не занимая памяти. Подскажите, пожалуйста, как с этим бороться? Ошибка BDE: Temporary Table Resource Limit.
Где-то читал что надо увеличить какую-то настройку, но неуверен. Помогите!!!!!!!!


ANB   (2007-02-13 18:36:00) [1]


> Я использую Oracle. Данные выбираю из Temporary Table(временной
> таблицы).

Беру все свои оправдательные к данному случаю слова обратно.

Пиши на PL/SQL - будет быстрее и чище. В противном случае это все равно, что плац ломом подметать.


Desdechado   (2007-02-13 18:24:00) [2]

> UniDirectional = True вызывает исключение.
По нему можно только Next делать, никаких Prior или First. И, естественно, никаких гридов и т.п. визуальщины.


Val   (2007-02-13 18:20:00) [3]

>Подскажите, пожалуйста, как с этим бороться?
>Последний пост ANB правильно трактует мою задачу.
>Я использую Oracle.
Наконец-то соизволили просвятить.
Бороться с этим предоставьте серверу. Напишите хп, используйте цикл по курсору - пусть он работает.


Johnmen   (2007-02-13 18:05:00) [4]


> К сожалению применение к TQuery свойства UniDirectional
> = True вызывает исключение. Пишет что датасет не поддерживает
> такую операцию. Скорее всего потому, что таблица временная.

Это потому, что ты пытаешься, явно или нет, работать с однонаправленным НД навигационными методами так, как будто он двунаправленный.


Grant   (2007-02-13 17:45:00) [5]

Спасибо за ответы. Последний пост ANB правильно трактует мою задачу. Но возникла ещё одна проблема. Я использую Oracle. Данные выбираю из Temporary Table(временной таблицы). К сожалению применение к TQuery свойства UniDirectional = True вызывает исключение. Пишет что датасет не поддерживает такую операцию. Скорее всего потому, что таблица временная.


ANB   (2007-02-13 12:07:00) [6]


> Johnmen ©   (13.02.07 10:09) [11]

Чет мы не о том спорим. Я в сабже не нашел, что автору записи нужны все одновременно. Проблема была их вытащить последовательно для обработки. И чтоб обработанные места в памяти не занимали. Вроде бы так.
А тащить пол-лимона для отображения - это изврат.


Johnmen   (2007-02-13 10:09:00) [7]


> Sergey Masloff   (13.02.07 06:31) [9]

Печать процесс последовательный, строка за строкой, лист за листом, а не все строки разом. И для этого вовсе нет необходимости держать ВСЕ записи единовременно.


evvcom   (2007-02-13 09:15:00) [8]

> [9] Sergey Masloff   (13.02.07 06:31)

Даже если в Excel их тащить, DataSet-у нафиг не нужно их все в кеше хранить. Кроме того, Excel на листе максимум 65536 строк имеет. Никак не поллимона.


Sergey Masloff   (2007-02-13 06:31:00) [9]

Johnmen ©   (12.02.07 18:06) [8]
Например нужно их напечатать. В Excelе ибо такое требоввание гос. органа. Предоставляются одновременно печатная и электронная формы. Это не с потолка пример :( к нам эпизодически приезжает грузовик за пачкой бумаги в 2 моих роста напечатаных самым мелким шрифтом Excel-я. На UNIX сервере формировать не всегда просто так что некие подобные извраты имеют место быть...


Johnmen   (2007-02-12 18:06:00) [10]


> Особенности технологии. Двунаправленные наборы, используемые
> для отображения (например в гриде) - тащат все на клиента.

И что? Теперь иметь сразу все поллимона, чтобы их посмотреть?
И однонаправленные тоже тащат все на клиента, но постепенно, и не держат всё скопом.

>  Для TQuery - уже подсказали способ.

Способ чего? Тащения?
Так я не о нём, а о необходимости, а точнее, её отсутствии, иметь ОДНОМОМЕНТНО на клиенте все записи.


ANB   (2007-02-12 16:13:00) [11]


> Но не все держать на клиенте одномоментно.

Особенности технологии. Двунаправленные наборы, используемые для отображения (например в гриде) - тащат все на клиента.
А вот избавление от этого тащения для разных библиотек - разные. У DOA, например, пришлось сменить компонент. Для TQuery - уже подсказали способ.


Johnmen   (2007-02-12 14:48:00) [12]


> ANB ©   (12.02.07 14:05) [5]
> то можно привести целую кучу примеров, когда нужно обработать
> и несколько миллионов(а то и миллиардов) записей, причем
> все их придется тащить на клиента.

Но не все держать на клиенте одномоментно.


ANB   (2007-02-12 14:05:00) [13]


> хачемнужно полмиллиона записей на клиенте?

ИМХО - товарищ использует SQL движок без хранимой логики. Или не знает, про ее наличие.
А ежли движок хранимки не поддерживает, то можно привести целую кучу примеров, когда нужно обработать и несколько миллионов(а то и миллиардов) записей, причем все их придется тащить на клиента.
Кистате, схожая картина и при конвертации, если пришлось делать ее через клиента. Тут и наличие хранимок не сильно помогает.


Desdechado   (2007-02-11 14:21:00) [14]

Query.Unidirectional=True
Однако остается открытым вопрос, хачемнужно полмиллиона записей на клиенте?


Johnmen   (2007-02-11 13:45:00) [15]


> Sergey Masloff   (11.02.07 08:16) [2]

Поддерживает.


Sergey Masloff   (2007-02-11 08:16:00) [16]

Или ответ от Johnmen ©   (11.02.07 00:17) [1] или использовать однонаправленный курсор (не помню уже за давностью лет, но вроде их поддерживает)


Johnmen   (2007-02-11 00:17:00) [17]


> Подскажите, пожалуйста, как с этим бороться?

Не возвращать столько записей. Ибо это бред...


Наверх

Титульная страница Поиск, карта сайта Написать письмо