crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

kibsoft
  опции профиля:
сообщение 17.2.2010, 16:53
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Есть ли способы считать все данные результата запроса без цикла while(query.next()) ? Мне надо считать все данные в QHash. В таблице 52000 записей и все это считывание занимает 6 секунд..
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 13)
Litkevich Yuriy
  опции профиля:
сообщение 17.2.2010, 19:14
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


kibsoft, от того, что ты воспользуешься другим способом скорость не изменится. В качестве объяснения:
Попробуй представить себе, что будет делать процессор в самом компактном случае.

Цитата(kibsoft @ 17.2.2010, 19:53) *
В таблице 52000 записей и все это считывание занимает 6 секунд..
считывание или перебор результатов с помощью while(query.next()) ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Elfinit
  опции профиля:
сообщение 17.2.2010, 20:12
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 127
Регистрация: 17.3.2009
Из: Казань
Пользователь №: 619

Спасибо сказали: 7 раз(а)




Репутация:   1  


Цитата(Litkevich Yuriy @ 17.2.2010, 19:14) *
считывание или перебор результатов

Я думаю, имелся ввиду именно перебор..Так существует способ без цикла поместить данные в контейнер? Через модели?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.2.2010, 20:25
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Elfinit @ 17.2.2010, 23:12) *
Через модели?
а что, это упростит работу? По моему ни сколько.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 17.2.2010, 21:15
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(Elfinit @ 17.2.2010, 20:12) *
Через модели?

Так это скорости не прибавит, если только наоборот, потому как SQL-модели являются обертками над QSqlQuery.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 17.2.2010, 23:01
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 17.2.2010, 20:14) *
kibsoft, от того, что ты воспользуешься другим способом скорость не изменится. В качестве объяснения:
Попробуй представить себе, что будет делать процессор в самом компактном случае.

Цитата(kibsoft @ 17.2.2010, 19:53) *
В таблице 52000 записей и все это считывание занимает 6 секунд..
считывание или перебор результатов с помощью while(query.next()) ?


Ну вроде ка перебор..Я заношу каждую запись в QHash.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.2.2010, 23:22
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(kibsoft @ 18.2.2010, 2:01) *
Ну вроде ка перебор.
дак ты вокруг цикла сделай так:
QTime t;
t.start();
while(query.next()){
...
}
qDebug() << "while time delta =" << t.elapsed();
и узнаешь точно
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 18.2.2010, 0:01
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 18.2.2010, 0:22) *
Цитата(kibsoft @ 18.2.2010, 2:01) *
Ну вроде ка перебор.
дак ты вокруг цикла сделай так:
QTime t;
t.start();
while(query.next()){
...
}
qDebug() << "while time delta =" << t.elapsed();
и узнаешь точно


Да я же так делал..6 секунд получилось. Вопрос то в чем, можно ли как-то по-другому получать данные из запроса? Или уже тут никак не ускорить этот процесс?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.2.2010, 3:29
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Что ты делаешь в этом цикле? Можешь всё тело цикла привести?
Какое-то страшное время у тебя получается.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kibsoft
  опции профиля:
сообщение 18.2.2010, 14:43
Сообщение #10


Участник
**

Группа: Участник
Сообщений: 180
Регистрация: 21.7.2009
Из: Самара
Пользователь №: 928

Спасибо сказали: 14 раз(а)




Репутация:   2  


Цитата(Litkevich Yuriy @ 18.2.2010, 4:29) *
Что ты делаешь в этом цикле? Можешь всё тело цикла привести?
Какое-то страшное время у тебя получается.


Таблица с двумя столбцами. Добавляем данные в QHash.
while(query.next())
hash[query.value[0].toString()]=query.value[1].toInt();
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.2.2010, 18:52
Сообщение #11


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Попробуй измерить время затрачиваемое только на эту строчку кода:
Цитата(kibsoft @ 18.2.2010, 17:43) *
hash[query.value[0].toString()]=query.value[1].toInt();
В качестве альтернативы попробуй:
hash.insert(query.value[0].toString(), query.value[1].toInt());
я не знаю изменится ли скорость.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PunX
  опции профиля:
сообщение 18.4.2010, 21:21
Сообщение #12


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 12.4.2009
Из: Димитровград
Пользователь №: 676

Спасибо сказали: 0 раз(а)




Репутация:   0  


В БД под управлением postgresql делаю запрос:
QSqlQuery q;
QSqlRecord rec = q.record();
QString res;
QString str = "SELECT * FROM \"Z\";";
if(!q.exec(str)){
    QMessageBox::warning(0,"warning","error of query!");
}
 while(q.next()){
 res = q.value(rec.indexOf("?column?")).toString();
 QString result = QString("%1").arg(res);
 QMessageBox::information(0,"info",res);
}

в результате получаю что в переменной res пусто и ошибку "QSqlQuery::value: not positioned on a valid record", хотя в БД запись есть. В базе тип поля значение которого вывожу numeric.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.4.2010, 22:45
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


посмотри, что возвращает q.size() после выполнения запроса

PunX, ты не корректно используешь ЗАПИСЬ
сначала спрашиваешь у запроса запись:
Цитата(PunX @ 19.4.2010, 1:21) *
QSqlRecord rec = q.record();
И только потом выполняешь запрос:
Цитата(PunX @ 19.4.2010, 1:21) *
if(!q.exec(str)){
Ты уверен, что запись действительна?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
PunX
  опции профиля:
сообщение 18.4.2010, 22:47
Сообщение #14


Студент
*

Группа: Участник
Сообщений: 56
Регистрация: 12.4.2009
Из: Димитровград
Пользователь №: 676

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возвращает 312, кол-во записей в таблице моей.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 7.6.2025, 6:05