![]() |
| ||
|
|
Новости |
Поиск |
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 в масив соотв. типа... В общем случае это вариантные данные.
wsv (2007-07-13 11:38:00) [41]
> отключения контролов нет,
> Контролов связанных с датасетами нет вообще.
Есть еще вариант разбить заданный период и/или выкинуть точки, неудовл. определенным условиям. например, нули, т.е. где сигнала не было. но после этого нужно будет запоминать откуда их выкинули и добавлять обратно в массив.
Сергей М. (2007-07-13 11:37:00) [42]
> rowcount:=dm.navdata.rowcount
Я не в курсе, что там творится в потрохах Zeos, но глубоко сомневаюсь, что RowCount вернет истинное число записей в выборке.
wsv (2007-07-13 11:35:00) [43]
> fieldbyname вынеси за пределы цикла
Это как? :-)
можно сделать fieldvalues или fields.field[0]... но как "вынести за цикл"?
> RowCount поменяй на not eof
Делал. Тоже самое.
sniknik (2007-07-13 11:30:00) [44]ага, ну вот [16], более менее
отключения контролов нет, RowCount поменяй на not eof, fieldbyname вынеси за пределы цикла, и StepBy делай не на каждую итерацию, а на видимую часть (видиш к примеру 100 квадратиков в прогрессе, рассчитай так чтобы было 100 StepBy)
изменилось чтонибудь?
wsv (2007-07-13 11:30:00) [45]
> Откуда тогда взялось значение RowCount ?
Блин... :-D
dm.navdata.close;
dm.navdata.sql.text:='Select ... from ... where...';
dm.navdata.open;
rowcount:=dm.navdata.rowcount;
:-D
Сергей М. (2007-07-13 11:27:00) [46]
> не все. за период, указанный юзером
Откуда тогда взялось значение RowCount ?
wsv (2007-07-13 11:27:00) [47]Контролов связанных с датасетами нет вообще.
Все в массивах.
sniknik (2007-07-13 11:26:00) [48]меня например очень интересует используешь ли ты отключение контролов, как идет доступ к полям, и не используешь ли ты чего нибудь что вычисляется на основе рекордсета (либо может вычисляться, смотря от того как сделаны Zeos-ы, (тут, от незнания, могу только предполагать, что это))
wsv (2007-07-13 11:25:00) [49]А можно как-то по другому?
Вот и спрашиваю, чо... :-D
wsv (2007-07-13 11:24:00) [50]
> а именно как делаешь то что по твоему тормозит.
i:=0;
dm.navdata.First;
while i<RowCount do
begin
fuelout[i]:=dm.navdata.fieldbyname('....').Value;
dm.navdata.Next;
inc(i);
pb.StepBy(1);
end;
sniknik (2007-07-13 11:21:00) [51]> Исходная информация. D7-Zeos-MySql.
это не то ... интересуют "волшебные пузырьки" в коде их [0], а именно как делаешь то что по твоему тормозит.
wsv (2007-07-13 11:18:00) [52]
> нафига каждый раз тащить все даннные, а не только вновь
> поступившие..
не все. за период, указанный юзером.
wsv (2007-07-13 11:17:00) [53]Исходная информация. D7-Zeos-MySql.
Навиг. данные: очень частая пилА - топливный датчик, показания с которого нифига не интегрированы.
1. Получаем данные датчика за период.
2. Загоняем в массив.
3. Преобразуем вейвлетом.
4. Линеаризуем.
5. Приводим к тарировке датчика
6. Ищем сливы-заправки
7. Выводим график расхода по тарировке и вероятные сливы-заправки.
Проблема в п.2
Все остальное очень быстро робит.
Плохиш (2007-07-13 11:16:00) [54]
> Дальше, только передача данных из запроса в массив занимает
> уже десятки секунд. Например на 100 тыс записей - это 18
> секунд передачи в массив.
Ну а что хотели, дай догадаюсь, постоянные перераспределения размеров массива. Производительность современных вычислительных систем в любом случае конечна, а вы тут такие объёмы данных по системе таскаете...
Сергей М. (2007-07-13 11:12:00) [55]
> Вейвлет преобразование и фильтрация силами Мускула?
Почему бы и нет ?
Я не в курсе, но разве Мускул не предоставляет механизма использования внешних пользовательских функций, подобного механизму UDF в IB ?
А если и не предоставляет, то все равно непонятно, нафига каждый раз тащить вседаннные, а не только вновь поступившие..
sniknik (2007-07-13 11:11:00) [56]> Как выйти из положения?
общеизвестный выход из положения - родить. ;о)
в твоем случае разродиться исходной информацией... (сам, я так понимаю, ошибку найти не в состоянии)
wsv (2007-07-13 11:08:00) [57]
> Почему бы не обработать их на стороне сервера ?
Ога... Вейвлет преобразование и фильтрация силами Мускула? :-D
wsv (2007-07-13 11:07:00) [58]
> "Принеси то, не знаю что?"
Период конечно известен. Это наше время. В общем случае - год-два-три...
> А причем тут отчет?
Отчет при том, что нужно сначала отловить обработкой заправки-сливы-остановки-стоянки, что уже сделано. На данных до 30 тыс. строк обработка (считывание+собственно поиск) занимает меньше секунды. Дальше, только передача данных из запроса в массив занимает уже десятки секунд. Например на 100 тыс записей - это 18 секунд передачи в массив.
Как выйти из положения?
Сергей М. (2007-07-13 11:04:00) [59]
> Данные нужно обработать сначала
Почему бы не обработать их на стороне сервера ?
Desdechado (2007-07-13 11:03:00) [60]> Нужен отчет за период. Границы периода неизвестны.
"Принеси то, не знаю что?"
> Это навигационные данные, которые поступают каждые 15-30 секунд.
А причем тут отчет?