Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Firefox от Декабрь 14, 2017, 12:01



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


Название: Re: Скорость обращения к данным
Отправлено: kuzulis от Декабрь 14, 2017, 12:13
А почему не делать выборку сразу из базы?


Название: Re: Скорость обращения к данным
Отправлено: Firefox от Декабрь 14, 2017, 12:25
Дело в том ,что к базе у меня нет прямого доступа и данные я получаю от клиента (написанная программа ,которая читает данные и по сети мне их гонит) , а это занимает много времени, потому мне бд пересылают один раз всего.


Название: Re: Скорость обращения к данным
Отправлено: Kurles от Декабрь 14, 2017, 12:34
QList быстрее не будет, так как всё равно надо по каждому элементу проходиться. Тут уже какой-либо индексации не обойтись.


Название: Re: Скорость обращения к данным
Отправлено: Firefox от Декабрь 14, 2017, 13:08
Stl iteratirs не быстрее при передвижении по контейнеру?


Название: Re: Скорость обращения к данным
Отправлено: ssoft от Декабрь 14, 2017, 14:23
Быстрее вектора другого контейнера с прямым доступом по индексу нет.

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

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

Все остальное затрагивает алгоритм, который похоже и нужно оптимизировать.


Название: Re: Скорость обращения к данным
Отправлено: Firefox от Декабрь 14, 2017, 14:48
Спасибо всем.


Название: Re: Скорость обращения к данным
Отправлено: qate от Декабрь 14, 2017, 15:54
какого уровня маломощная техника и размер базы ?


Название: Re: Скорость обращения к данным
Отправлено: Firefox от Декабрь 15, 2017, 12:45
Бд приблизительно от 500 КБ ,а техника точно не знаю. Приблизительно 2 ядра по 1 ГГц


Название: Re: Скорость обращения к данным
Отправлено: Igors от Декабрь 15, 2017, 13:34
Что-то не так, если размер вектора не мульены - ресурсов должно хватать. Часто в таких случаях где-то проскочила передача вектора по значению.


Название: Re: Скорость обращения к данным
Отправлено: Firefox от Декабрь 15, 2017, 17:06
Возвращаемый вектор у меня стоит как аргумент функции и он внутри класса заполняется, а функция вызывается из другого класса. И по базе у меня пробегает не один раз а пять