![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замедление DataSet.next [D7, MySQL]
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
....