Russian Qt Forum

Qt => Model-View (MV) => Тема начата: Bepec от Март 13, 2013, 12:58



Название: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Bepec от Март 13, 2013, 12:58
Приветствую заглянувших.

Вопрос - как отобразить пользователю примерно 6-20 миллионов записей?

Проблема - при ленивой загрузке невозможен быстрый переход по записям.
При fetchMore() переполнение 2 гб памяти и крах программы.
Должен же быть какой-либо способ/модель для быстрого и прозрачного для пользователя отображения записей.


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: alexis031182 от Март 13, 2013, 15:28
Верес, я конечно вряд ли скажу что-то новое, но неужели нельзя внедрить хоть какую-то фильтрацию по эти данным? Такой объём для просмотра ни один человек не осилит без ряда перекуров.


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Bepec от Март 13, 2013, 15:51
Кхм. Наверно опять я невнятно пишу.

Смысл в том, что стандартные модели Qt не позволяют отобразить сразу общее количество записей и прозрачно для пользователя оперировать с ними.

Пара примеров:
QSqlTableModel/Relation
1) При полной загрузке данных падает программа (2 гига памяти в мусор).

2) При ленивой загрузке данных пользователя тормозят каждые 256 записей на полсекунды, ползунок скажет и не может продвинуться дальше "текущее положение + 256". И при достижении 4 млн записей (они не сбрасываются, а остаются в памяти) см. пункт 1.

QueryModel не позволяет без довольно серьёзного допила шастать по записям. Нужен менеджер, учитывающий текущее положение, положение курсора, максимальное количество записей и прочая.

Я вон напилил делегат для подгрузки данных. Сейчас там тупо слайдер с максимальным количеством записей, таблица с 100 записями(пустыми). Позволяет спокойно ездить по 70 млн записей без загрузки проца и прочего. Собственно задумываю то ли модель такую запилить, то ли делегат оставить.

PS причём мне делегат кажется более привлекательным. Ибо в модели придётся ковырять и размещение записей, скроллбары и прочая. А так тупо делегат с привязкой к переменной типа инт.





Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: panAlexey от Март 13, 2013, 16:06
Про ползунок забыть надо-бы.
Объекты в Qt они на сербьезные нагрузки не расчитаны.
Для отображения такого кол-ва надо что-то свое писать.


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: alexis031182 от Март 13, 2013, 16:12
Верес, я имел в виду фильтрацию на уровне запроса, чтобы сократить количество строк. Ну не верю я, что нельзя отфильтровать Ваши данные до пары сотен действительно актуальных строк. Там по дате, по ещё каким колонкам. Иначе объём какой-то невменяемый для просмотра.


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Bepec от Март 13, 2013, 16:37
У списка информативная роль. Т.е. в принципе можно сделать query модель, но... Но при запросе всех строк валится всё нафиг :D

Именно проблемка то в том, что при отображении всего содержимого базы последовательно. Т.е. 500 строк -> 500 строк начиная с 500 -> 500 строк начиная с 1000.

Если использовать Qt модели, они все сохраняют просмотренные ранее данные.                    Т.е. 500 -> 1000 -> 1500.

Если Query модель, то нужно ограничивать запросы. Но это уже бред какой то получается :D С теми же ползунками геморроя ещё больше.

У меня сейчас делегат динамически работает - 1 ячейка, видимая - один запрос.

Ну, слайдер преобразуем в ползунок, скрываем у view его ползуноки и получаем профит с костылями :D


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: xokc от Март 13, 2013, 17:04
Ну не верю я, что нельзя отфильтровать Ваши данные до пары сотен действительно актуальных строк. Иначе объём какой-то невменяемый для просмотра.
Соглашусь - мне кажется, что столько записей сразу пользователю и не нужно.
Если всё же нужно (ЗАЧЕМ!!!?) - читать тут (сам не исследовал, просто когда-то наткнулся):
http://doc.qt.digia.com/qq/qq07-big-tables.html
http://www.qtcentre.org/threads/49061-how-to-manipulate-a-very-large-data-using-QT
http://www.qtcentre.org/threads/4328-Huge-tableview-low-performance


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Bepec от Март 13, 2013, 17:52
Кхм. Блин! Кто нить читает мои сообщения?!!!!!  ??? ??? ??? ???

Я предоставляю пользователю данные по 100-500. Сколько умещается на экране.

Но если для этого использовать Qt модели, невозможно просмотреть пятимиллионную запись без предварительной загрузки пяти миллионов строк. Они все загружают данные ПОСЛЕДОВАТЕЛЬНО. И нет никаких функций ( я не нашёл, возможно ) для очистки предыдущих данных. Т.е. чтобы просмотреть пятимиллионную, нужно памяти на 5 миллионов записей, чего нет.

И да, доступ к данным в виде "что вижу, то храню" уже сделан в виде делегата. (темой ниже :) )


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Странник от Март 14, 2013, 13:31
Кхм. Блин! Кто нить читает мои сообщения?!!!!!  ??? ??? ??? ???

Я предоставляю пользователю данные по 100-500. Сколько умещается на экране.

Но если для этого использовать Qt модели, невозможно просмотреть пятимиллионную запись без предварительной загрузки пяти миллионов строк. Они все загружают данные ПОСЛЕДОВАТЕЛЬНО. И нет никаких функций ( я не нашёл, возможно ) для очистки предыдущих данных. Т.е. чтобы просмотреть пятимиллионную, нужно памяти на 5 миллионов записей, чего нет.

И да, доступ к данным в виде "что вижу, то храню" уже сделан в виде делегата. (темой ниже :) )

у стандартных моделей такого функционала нет.
если необходимо отображать лишь часть данных, вы можете запрашивать лишь необходимую часть у СУБД, используя SQL-предложение LIMIT:
Код:
-- пропускаем 200 строк и выбираем следующие 100 (то есть строки с 201-й по 300-ю)
SELECT * FROM t LIMIT 100 OFFSET 200


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Авварон от Март 14, 2013, 17:12
Ну вообще-то, всё давно придумано "за вас". Да, придется написать свою модель, делающую свои запросы к БД. А дальше - в модели реализуете кэширование - при обращении к data() читаете их из БД, кладете в кэш. Если данные уже есть в кэше, ставите им плюсик (или таймстемп). При инсерте в кэш выпихиваете самые старые данные из него. В общем-то всё. Вьюхе не нужны вся модель, она запрашивает только текущие данные.


Название: Re: SQL Database (sqlite) и отображение большого количества данных
Отправлено: Bepec от Март 14, 2013, 17:23
Да собственно уже реализовано :D В который раз говорю.

И модели для моей, собственно, задумки не нужно. Для read only просмотра.

Но благодарен за советы. Вот кстати кеширование в Qt моделях их и убивает. Очистки кеша у них нет "D