Форум: "Базы";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
ВнизTQuery и память Найти похожие ветки
← →
Grant (2007-02-10 23:59) [0]Всем привет. Помогите с такой проблеммой.
У меня есть компонент TQuery. Добавляю в него запрос.
Делаю Open и First. Сразу скажу что запрос возвращает 500000 строк. Дальше пишу такой цикл
while not TQuery.Eof do
begin
.......
Next;
end;
Так вот в чем проблемма. По мере того как увеличивается проход по циклу, у меня увеличивается занимаемая приложением память. В конечном итоге она доходит до предела и приложение виснет. Пробовал выполнять запрос и не делать прохода по циклу и приложение нормально отрабатывало не занимая памяти. Подскажите, пожалуйста, как с этим бороться? Ошибка BDE: Temporary Table Resource Limit.
Где-то читал что надо увеличить какую-то настройку, но неуверен. Помогите!!!!!!!!
← →
Johnmen © (2007-02-11 00:17) [1]
> Подскажите, пожалуйста, как с этим бороться?
Не возвращать столько записей. Ибо это бред...
← →
Sergey Masloff (2007-02-11 08:16) [2]Или ответ от Johnmen © (11.02.07 00:17) [1] или использовать однонаправленный курсор (не помню уже за давностью лет, но вроде их поддерживает)
← →
Johnmen © (2007-02-11 13:45) [3]
> Sergey Masloff (11.02.07 08:16) [2]
Поддерживает.
← →
Desdechado © (2007-02-11 14:21) [4]Query.Unidirectional=True
Однако остается открытым вопрос, хачемнужно полмиллиона записей на клиенте?
← →
ANB © (2007-02-12 14:05) [5]
> хачемнужно полмиллиона записей на клиенте?
ИМХО - товарищ использует SQL движок без хранимой логики. Или не знает, про ее наличие.
А ежли движок хранимки не поддерживает, то можно привести целую кучу примеров, когда нужно обработать и несколько миллионов(а то и миллиардов) записей, причем все их придется тащить на клиента.
Кистате, схожая картина и при конвертации, если пришлось делать ее через клиента. Тут и наличие хранимок не сильно помогает.
← →
Johnmen © (2007-02-12 14:48) [6]
> ANB © (12.02.07 14:05) [5]
> то можно привести целую кучу примеров, когда нужно обработать
> и несколько миллионов(а то и миллиардов) записей, причем
> все их придется тащить на клиента.
Но не все держать на клиенте одномоментно.
← →
ANB © (2007-02-12 16:13) [7]
> Но не все держать на клиенте одномоментно.
Особенности технологии. Двунаправленные наборы, используемые для отображения (например в гриде) - тащат все на клиента.
А вот избавление от этого тащения для разных библиотек - разные. У DOA, например, пришлось сменить компонент. Для TQuery - уже подсказали способ.
← →
Johnmen © (2007-02-12 18:06) [8]
> Особенности технологии. Двунаправленные наборы, используемые
> для отображения (например в гриде) - тащат все на клиента.
И что? Теперь иметь сразу все поллимона, чтобы их посмотреть?
И однонаправленные тоже тащат все на клиента, но постепенно, и не держат всё скопом.
> Для TQuery - уже подсказали способ.
Способ чего? Тащения?
Так я не о нём, а о необходимости, а точнее, её отсутствии, иметь ОДНОМОМЕНТНО на клиенте все записи.
← →
Sergey Masloff (2007-02-13 06:31) [9]Johnmen © (12.02.07 18:06) [8]
Например нужно их напечатать. В Excelе ибо такое требоввание гос. органа. Предоставляются одновременно печатная и электронная формы. Это не с потолка пример :( к нам эпизодически приезжает грузовик за пачкой бумаги в 2 моих роста напечатаных самым мелким шрифтом Excel-я. На UNIX сервере формировать не всегда просто так что некие подобные извраты имеют место быть...
← →
evvcom © (2007-02-13 09:15) [10]> [9] Sergey Masloff (13.02.07 06:31)
Даже если в Excel их тащить, DataSet-у нафиг не нужно их все в кеше хранить. Кроме того, Excel на листе максимум 65536 строк имеет. Никак не поллимона.
← →
Johnmen © (2007-02-13 10:09) [11]
> Sergey Masloff (13.02.07 06:31) [9]
Печать процесс последовательный, строка за строкой, лист за листом, а не все строки разом. И для этого вовсе нет необходимости держать ВСЕ записи единовременно.
← →
ANB © (2007-02-13 12:07) [12]
> Johnmen © (13.02.07 10:09) [11]
Чет мы не о том спорим. Я в сабже не нашел, что автору записи нужны все одновременно. Проблема была их вытащить последовательно для обработки. И чтоб обработанные места в памяти не занимали. Вроде бы так.
А тащить пол-лимона для отображения - это изврат.
← →
Grant (2007-02-13 17:45) [13]Спасибо за ответы. Последний пост ANB правильно трактует мою задачу. Но возникла ещё одна проблема. Я использую Oracle. Данные выбираю из Temporary Table(временной таблицы). К сожалению применение к TQuery свойства UniDirectional = True вызывает исключение. Пишет что датасет не поддерживает такую операцию. Скорее всего потому, что таблица временная.
← →
Johnmen © (2007-02-13 18:05) [14]
> К сожалению применение к TQuery свойства UniDirectional
> = True вызывает исключение. Пишет что датасет не поддерживает
> такую операцию. Скорее всего потому, что таблица временная.
Это потому, что ты пытаешься, явно или нет, работать с однонаправленным НД навигационными методами так, как будто он двунаправленный.
← →
Val © (2007-02-13 18:20) [15]>Подскажите, пожалуйста, как с этим бороться?
>Последний пост ANB правильно трактует мою задачу.
>Я использую Oracle.
Наконец-то соизволили просвятить.
Бороться с этим предоставьте серверу. Напишите хп, используйте цикл по курсору - пусть он работает.
← →
Desdechado © (2007-02-13 18:24) [16]> UniDirectional = True вызывает исключение.
По нему можно только Next делать, никаких Prior или First. И, естественно, никаких гридов и т.п. визуальщины.
← →
ANB © (2007-02-13 18:36) [17]
> Я использую Oracle. Данные выбираю из Temporary Table(временной
> таблицы).
Беру все свои оправдательные к данному случаю слова обратно.
Пиши на PL/SQL - будет быстрее и чище. В противном случае это все равно, что плац ломом подметать.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.048 c