Russian Qt Forum
Ноябрь 23, 2024, 21:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Скорость обращения к данным  (Прочитано 5081 раз)
Firefox
Гость
« : Декабрь 14, 2017, 12:01 »

Добрый день. Хочу спросить совета по использованию контейнеров. Задача у меня следующая: есть база данных( большая) я ее считываются в QVectot(struct) . В векторе элементом является структура определенного вида. Далее каждые 0.5 секунды мне надо осуществлять выборку из этого вектора по входящим параметрам. Делала ее просто сравнением при обращении по индексу at(i), где i от 0 до размера вектора. Если все подходит, то записываю этот элемент at(i) в новый вектор- результат выборки. Проблемы возникли в том, что при установке программы на маломощную технику (очень маломощную) загрузка процессора 100% и комп умирает. Как можно оптимизировать затраты процессора на одну операцию? Возможно QList будет быстрее?
Вариант с проверкой на изменение параметров, чтобы не делать перебор лишний раз если ничего не поменялось не то про что я спрашиваю. Я спрашиваю про оптимизацию именно с точки зрения программирования, а не алгоритмики.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Декабрь 14, 2017, 12:13 »

А почему не делать выборку сразу из базы?
Записан

ArchLinux x86_64 / Win10 64 bit
Firefox
Гость
« Ответ #2 : Декабрь 14, 2017, 12:25 »

Дело в том ,что к базе у меня нет прямого доступа и данные я получаю от клиента (написанная программа ,которая читает данные и по сети мне их гонит) , а это занимает много времени, потому мне бд пересылают один раз всего.
Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #3 : Декабрь 14, 2017, 12:34 »

QList быстрее не будет, так как всё равно надо по каждому элементу проходиться. Тут уже какой-либо индексации не обойтись.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Firefox
Гость
« Ответ #4 : Декабрь 14, 2017, 13:08 »

Stl iteratirs не быстрее при передвижении по контейнеру?
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #5 : Декабрь 14, 2017, 14:23 »

Быстрее вектора другого контейнера с прямым доступом по индексу нет.

* При использовании QVector для чтения значений нужно использовать константные методы (в данном случае at() уже используется).
* Заполняемый массив необходимо распределить заранее с помощью QVector::reserve( int size ), чтобы не происходило перераспределение.

С помощью QtConcurent можно организовать параллельную обработку вектора в пуле потоков, не изменяя сам алгоритм.

Все остальное затрагивает алгоритм, который похоже и нужно оптимизировать.
Записан
Firefox
Гость
« Ответ #6 : Декабрь 14, 2017, 14:48 »

Спасибо всем.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #7 : Декабрь 14, 2017, 15:54 »

какого уровня маломощная техника и размер базы ?
Записан
Firefox
Гость
« Ответ #8 : Декабрь 15, 2017, 12:45 »

Бд приблизительно от 500 КБ ,а техника точно не знаю. Приблизительно 2 ядра по 1 ГГц
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 15, 2017, 13:34 »

Что-то не так, если размер вектора не мульены - ресурсов должно хватать. Часто в таких случаях где-то проскочила передача вектора по значению.
Записан
Firefox
Гость
« Ответ #10 : Декабрь 15, 2017, 17:06 »

Возвращаемый вектор у меня стоит как аргумент функции и он внутри класса заполняется, а функция вызывается из другого класса. И по базе у меня пробегает не один раз а пять
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.282 секунд. Запросов: 23.