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

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

Замедление DataSet.next [D7, MySQL]


Страницы:   1 2 3 4

wsv ©   (2007-07-13 10:28:00) 

Здравствуйте.
Столкнулся с проблемой при больших DataSet-ах с доступом к MySql с помщью компонентов Zeos.
В DataSet (точнее ZQuery, который наследник DataSet), выбирается большое количество данных, 50 тысяч строк и более.
При считывании результата запроса циклом while...do begin ... Dataset.next... происходит замеделение считывания, которое визуально отловлено простым прогрессором.

КАК ИЗБАВИТЬСЯ?

Может можно как-то другими способами скопировать результат в массив?

В частном случае копируются данные типа duoble в масив соотв. типа... В общем случае это вариантные данные.


sniknik   (2007-07-13 12:05:00) [21]

> fuelin:array of double;
> setlength (fuelin, rowcount);
> while... do begin...end
ошибка. с учетом уже приведенного, у тебя теряется 2 записи. если конечно принять что курсор локальный и данные выбираются все сразу.


wsv   (2007-07-13 12:03:00) [22]


> плюс ко всем тем очевидным "кривостям" и неоптимальностям
> в коде, что он привел)


Попробуйте еще как-то оптимизировать цикл while do begin end...
:-D


Сергей М.   (2007-07-13 12:00:00) [23]


> Это типичный однонаправленный набор данных


Это он использует его как однонаправленный.

А сам НД вполне может у него быть и двунаправленным, о чем он вероятно не подозревает и не задумывается.

Оттого и "тормоза" ощутимые (если не сказать основные) добавляются, плюс ко всем тем очевидным "кривостям" и неоптимальностям в коде, что он привел)


wsv   (2007-07-13 12:00:00) [24]


> Это типичный однонаправленный набор данных!
> И определение массива не приведено.


fuelin:array of double;

setlength (fuelin, rowcount);

while... do begin...end


wsv   (2007-07-13 11:59:00) [25]

По количеству записей вопросов нет. :-D

Есть вопрос по скорости чтения результатов запроса... Ну или копированию этих результатов в массив...

ЗЫ. Данные выбираются ВСЕ. Это точно. Про баги с RowCount я знаю и проверял на начальном этапе....
ЗЗЫ. tfield выключил. DisableControls добавил. Немного ускорилось. Добавил к периоду неделю с приемлемой скоростью. За это СПАСИБО.


Anatoly Podgoretsky   (2007-07-13 11:55:00) [26]

Это типичный однонаправленный набор данных!
И определение массива не приведено.


Сергей М.   (2007-07-13 11:52:00) [27]


> Потому што при заполнении массива нет ошибок


А с какого перепугу они должны возникнуть ?

Открыв НД ты тут жепрочитал св-во RowCount, пребывая в святой уверенности в том что получил действительное число записей в этом НД, после чего выделил соответствующую память под массив. Где здесь "криминал" ? Нету его) ... Засада же может поджидать тебя с совершенно иной сторона - число записей в НД в реальности больше, чем то что ты получил вот таким макаром.


sniknik   (2007-07-13 11:51:00) [28]

> Потому што при заполнении массива нет ошибок.
а с чего им быть если rowcount вернул частичное значение количества на еще не полностью скачанном рекордсете, массив ты сформировал по этому размеру и перенос сделал по нему же, не обращая внимания что данных уже больше.
(я вообщето подумал что у тебя клиентский курсор, наподобие в ADO, и данные приходят все без докачек...)


wsv   (2007-07-13 11:50:00) [29]


> а если не бегать? если составить запрос на обьеденение так
> чтобы все рядом было?


Данные тарировки физически лежат в другой базе. На этапе разработки они просто загнаны в мемо (их около 10 строк всего). Они тоже читаются в массивчик и входные данные тарируются клиентом.

А с чем объединить еще, я не знаю. :-D


Плохиш   (2007-07-13 11:47:00) [30]


> sniknik ©   (13.07.07 11:44) [32]
> > PS. Тормознутые эти zeos, я бы перешёл на адо :-)
> точно знаеш? работал?

Хотел перейти, начитавшись рекламы :-) Переделал проект с адо на зеос и время обработки увеличилось в 4 раза, покрутил ещё там чего-то немного и забросил. Теперь пользуюсь стандартными проверенными технологиями :-)


wsv   (2007-07-13 11:47:00) [31]


> С чего ты так уверен ?


Потому што при заполнении массива нет ошибок.


sniknik   (2007-07-13 11:46:00) [32]

> Представь если еще бегать при линеаризации, тарировке и поиске заправок и сливов по датасету... :-D
а если не бегать? если составить запрос на обьеденение так чтобы все рядом было?


Сергей М.   (2007-07-13 11:45:00) [33]


> Возвращает правильно


С чего ты так уверен ?

Last после открытия НД ты явно не делаешь, делает ли это неявно Zeos ты тоже не знаешь, предоставляет ли эту "фичу" сам Мускул - тебе тоже неведомо..


> Сомневаться не приходится, ибо инвалид поинтер оперэйшен


Чевой-то ?)


sniknik   (2007-07-13 11:44:00) [34]

> PS. Тормознутые эти zeos, я бы перешёл на адо :-)
точно знаеш? работал?


wsv   (2007-07-13 11:43:00) [35]


> Кроме того мне не понятно, зачем еще раз данные читать в
> массив, если они уже есть в датасете (тот же массив).


Представь если еще бегать при линеаризации, тарировке и поиске заправок и сливов по датасету... :-D
Именно поэтому и массивы.


sniknik   (2007-07-13 11:42:00) [36]

> Это как? :-)
> можно сделать fieldvalues или fields.field[0]... но как "вынести за цикл"?
var
 Fld: TField;
begin
 Fld:= dm.navdata.fieldbyname('....');
 while i<RowCount do
   Fld.Value;

у многих получение индекса поля по имени расчетное... т.е. тратит время.
> RowCount поменяй на not eof
> Делал. Тоже самое.
это просто более правильно, но когда писал не было этого
> rowcount:=dm.navdata.rowcount;
тут тебе можно просто for i:= 0 to ... поставить, этот цикл быстрее изза другого рода проверки выхода (а она каждый раз не нужна т.к. судя по всему рекордсет локальный)

а StepBy? возьми просто убери прогресс и засеки общее время, и контнролы отключи обязательно даже если их нет (проверка может быть на разных уровнях вложенности, отключенные тобой это самый первый уровень, быстрее всего)


Плохиш   (2007-07-13 11:41:00) [37]

и окружить всё в

dm.navdata.DisableControls;
try
  // Твой код
finally
 dm.navdata.EnableControls;
end;


PS. Тормознутые эти zeos, я бы перешёл на адо :-)


Desdechado   (2007-07-13 11:40:00) [38]

>  но как "вынести за цикл"?
FieldByName возвращает указатель на поле. Сохрани его до цикла. Это сильно влияет на скорость. Потом просто в цикле будет указатель.As...

Кроме того мне не понятно, зачем еще раз данные читать в массив, если они уже есть в датасете (тот же массив).


wsv   (2007-07-13 11:39:00) [39]


> RowCount вернет истинное число записей в выборке.


Возвращает правильно. Сомневаться не приходится, ибо инвалид поинтер оперэйшен... :-)


Плохиш   (2007-07-13 11:39:00) [40]


> wsv ©   (13.07.07 11:35) [23]
>
> > fieldbyname вынеси за пределы цикла
>
> Это как? :-)
> можно сделать fieldvalues или fields.field[0]... но как
> "вынести за цикл"?

var
     tmpField: T<xxx>Field;
...
 tmpField := dm.navdata.fieldbyname('....');
 while not dm.navdata.eof do
....


Страницы:   1 2 3 4

Наверх

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