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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: SQL Database (sqlite) и отображение большого количества данных  (Прочитано 6835 раз)
Bepec
Гость
« : Март 13, 2013, 12:58 »

Приветствую заглянувших.

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

Проблема - при ленивой загрузке невозможен быстрый переход по записям.
При fetchMore() переполнение 2 гб памяти и крах программы.
Должен же быть какой-либо способ/модель для быстрого и прозрачного для пользователя отображения записей.
Записан
alexis031182
Гость
« Ответ #1 : Март 13, 2013, 15:28 »

Верес, я конечно вряд ли скажу что-то новое, но неужели нельзя внедрить хоть какую-то фильтрацию по эти данным? Такой объём для просмотра ни один человек не осилит без ряда перекуров.
Записан
Bepec
Гость
« Ответ #2 : Март 13, 2013, 15:51 »

Кхм. Наверно опять я невнятно пишу.

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

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

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

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

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

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



« Последнее редактирование: Март 13, 2013, 15:53 от Bepec » Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #3 : Март 13, 2013, 16:06 »

Про ползунок забыть надо-бы.
Объекты в Qt они на сербьезные нагрузки не расчитаны.
Для отображения такого кол-ва надо что-то свое писать.
« Последнее редактирование: Март 13, 2013, 16:56 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
alexis031182
Гость
« Ответ #4 : Март 13, 2013, 16:12 »

Верес, я имел в виду фильтрацию на уровне запроса, чтобы сократить количество строк. Ну не верю я, что нельзя отфильтровать Ваши данные до пары сотен действительно актуальных строк. Там по дате, по ещё каким колонкам. Иначе объём какой-то невменяемый для просмотра.
Записан
Bepec
Гость
« Ответ #5 : Март 13, 2013, 16:37 »

У списка информативная роль. Т.е. в принципе можно сделать query модель, но... Но при запросе всех строк валится всё нафиг Веселый

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

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

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

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

Ну, слайдер преобразуем в ползунок, скрываем у view его ползуноки и получаем профит с костылями Веселый
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Март 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
Записан
Bepec
Гость
« Ответ #7 : Март 13, 2013, 17:52 »

Кхм. Блин! Кто нить читает мои сообщения?!!!!!  Непонимающий Непонимающий Непонимающий Непонимающий

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

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

И да, доступ к данным в виде "что вижу, то храню" уже сделан в виде делегата. (темой ниже Улыбающийся )
Записан
Странник
Гость
« Ответ #8 : Март 14, 2013, 13:31 »

Кхм. Блин! Кто нить читает мои сообщения?!!!!!  Непонимающий Непонимающий Непонимающий Непонимающий

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

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

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

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

Сообщений: 3260


Просмотр профиля
« Ответ #9 : Март 14, 2013, 17:12 »

Ну вообще-то, всё давно придумано "за вас". Да, придется написать свою модель, делающую свои запросы к БД. А дальше - в модели реализуете кэширование - при обращении к data() читаете их из БД, кладете в кэш. Если данные уже есть в кэше, ставите им плюсик (или таймстемп). При инсерте в кэш выпихиваете самые старые данные из него. В общем-то всё. Вьюхе не нужны вся модель, она запрашивает только текущие данные.
Записан
Bepec
Гость
« Ответ #10 : Март 14, 2013, 17:23 »

Да собственно уже реализовано Веселый В который раз говорю.

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

Но благодарен за советы. Вот кстати кеширование в Qt моделях их и убивает. Очистки кеша у них нет "D
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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