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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Большие модели  (Прочитано 15363 раз)
titan83
Гость
« : Октябрь 02, 2016, 10:35 »

Уважаемые коллеги, здравствуйте.
Работа с Qt MVC получается неплохо, но возник вопрос: на небольших моделях (пара тысяч ячеек) все работает неплохо, но если набор данных достаточно большой (сейчас есть 10000 ячеек), то загрузка (с сервера sql) получается долгой (15-20 секунд), это, в принципе, еще терпимо, но будут таблицы под 100000 ячеек, и это будет шляпа.
Вполне логично возникает идея не загружать весь набор данных я только небольшую часть, видимую пользователю. И вот тут есть непонимание: допустим, я получаю часть набора (например, 100-200 записей) из базы, но если я буду говорить в модели, что у меня rowCount() == 200, то я получу неправильный скроллбар (не такой, как для итоговых 50000 записей).
Собственно вопрос: как правильно работать с большими массивами данных в моделях?
Думаю, что есть готовые алгоритмы, но пока не нашел.
Спасибо.
« Последнее редактирование: Октябрь 02, 2016, 20:40 от titan83 » Записан
Bepec
Гость
« Ответ #1 : Октябрь 02, 2016, 12:12 »

ИМХО - модели в Qt неприспособлены для больших объемов данных.

Как вариант - перейти к постраничной обработке. Т.е. получаем кол-во записей, делим на помещающиеся на экране/таблице/магическое число, получаем количество страниц Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Октябрь 02, 2016, 13:14 »

ИМХО - модели в Qt неприспособлены для больших объемов данных.
Традиционный бред. Улыбающийся

если набор данных достаточно большой (сейчас есть 10000 ячеек), то загрузка (с сервера sql) получается долгой (15-20 секунд)
Какое-то огромное время для такого небольшого объема записей.
Как у вас получается так долго получать данные? Что это за сервер БД?
Записан
titan83
Гость
« Ответ #3 : Октябрь 02, 2016, 14:07 »

Цитировать
Какое-то огромное время для такого небольшого объема записей.
Как у вас получается так долго получать данные? Что это за сервер БД?
Здравствуйте, база MSSQL, программа работает под линуксом.
В принципе, время доступа сопоставимо с нативной программой под виндовсом (может на пару секунд больше, но моя прога запускается на ARM 1Ghz, а не на Core i7), думаю, это из-за того, что запрос довольно сложный - несколько inner join, десяток полей.
После загрузки работает нормально, но вот время этой самой загрузки слегка напрягает.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Октябрь 02, 2016, 14:17 »

Здравствуйте, база MSSQL, программа работает под линуксом.
В принципе, время доступа сопоставимо с нативной программой под виндовсом (может на пару секунд больше, но моя прога запускается на ARM 1Ghz, а не на Core i7), думаю, это из-за того, что запрос довольно сложный - несколько inner join, десяток полей.
После загрузки работает нормально, но вот время этой самой загрузки слегка напрягает.
Я правильно понял, что у вас на арме под linux запускается сервер MSSQL?
Записан
Bepec
Гость
« Ответ #5 : Октябрь 02, 2016, 15:22 »

[offtop] загрузите ка в стандартную sql модель пару тройку десятков миллионов записей... Посмотрите на получившееся тормозное страшное чудо и поймете, что большие объемы данных и модели Qt, это несовместимо.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Октябрь 02, 2016, 15:42 »

[offtop] загрузите ка в стандартную sql модель пару тройку десятков миллионов записей... Посмотрите на получившееся тормозное страшное чудо и поймете, что большие объемы данных и модели Qt, это несовместимо.
Ооо. Уже пару тройку десятков миллионов... Вроде у ТС были жалкие 10 тысяч. Улыбающийся
Модели в Qt тормозят не более самой базы данных. Главное не пользоваться стандартными прокси-моделями для сортировки таких выборок.

Ну и не устану повторять: такие выборки по 100 тысяч строк (не говоря уже о смехотворных десятках миллионов) совершенно бесполезны. Ни один человек с ними ничего сделать не сможет. Нужны нормальные системы фильтрации.
« Последнее редактирование: Октябрь 02, 2016, 15:45 от Old » Записан
Bepec
Гость
« Ответ #7 : Октябрь 02, 2016, 16:12 »

Так вы определитесь.
Или же я прав - модели Qt не годятся при работе с большими объемами данных.
Или же модели Qt способны переварить миллионы - и тогда я неправ Веселый
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Октябрь 02, 2016, 16:20 »

Или же модели Qt способны переварить миллионы - и тогда я неправ Веселый
Конечно способны. Модель в Qt это универсальный интерфейс для отображения любых данных. А вот реализации этих интерфейсов могут быть разные.
Модель Qt может легко использоваться для отображать таблиц с сотнями миллионов записей, и это будет вообще без загрузки процессора.
Записан
titan83
Гость
« Ответ #9 : Октябрь 02, 2016, 16:40 »

Цитировать
Я правильно понял, что у вас на арме под linux запускается сервер MSSQL?
Нет.
Сервер MSSQL - отдельный, под виндовз, обычно в одной локалке, но может быть и в облаке.
мой ARM - один из возможных клиентов, на нем работает только моя qt-программа.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Октябрь 02, 2016, 16:44 »

Нет.
Сервер MSSQL - отдельный, под виндовз, обычно в одной локалке, но может быть и в облаке.
мой ARM - один из возможных клиентов, на нем работает только моя qt-программа.
Ну тогда выборку делает сервер MSSQL на нормальной машине. Неужели эта выборка готовиться десятки секунд?
Вы можете сделать руками эту выборку из какого-то клиента БД и посмотреть за сколько она будет формироваться.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Октябрь 02, 2016, 16:47 »

Или же модели Qt способны переварить миллионы - и тогда я неправ Веселый

Стандартные имплементации этих моделей не способны.
Оверхэд слишком большой.
Всегда приходится свою логику городить.

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
titan83
Гость
« Ответ #12 : Октябрь 02, 2016, 17:23 »

Нет.
Сервер MSSQL - отдельный, под виндовз, обычно в одной локалке, но может быть и в облаке.
мой ARM - один из возможных клиентов, на нем работает только моя qt-программа.
Ну тогда выборку делает сервер MSSQL на нормальной машине. Неужели эта выборка готовиться десятки секунд?
Вы можете сделать руками эту выборку из какого-то клиента БД и посмотреть за сколько она будет формироваться.
Так и сделал - запустил нативный клиент на своем ноуте - он открывает ту же таблицу за 4-5 секунд, моя программа за 15-17 секунд. Но при этом непосредственно выборка занимает 6,5 секунд, что, на мой взгляд, нормально (учитывая драйвера freetds для mssql). Остальное время (7-7,5 секунд) уходит на заполнение модели.
Так что, видимо, надо смотреть в сторону оптимизации заполнения внутренних данных.
Код:
    qDebug() << "before sql" << QTime::currentTime().toString("mm:ss.zzz");
    QWshDatabase::SqlRecordsList data = DB->wshData(_vars["WshCode"], _vars["Filter"]);
    qDebug() << "after sql" << QTime::currentTime().toString("mm:ss.zzz");
    qDebug() << "before model" << QTime::currentTime().toString("mm:ss.zzz");
    resetModel();
    _data.resize(_hHeaders.size());

    if (_data.size() > 0)
        for (int i = 0; i < data.size(); i++) {
            QWshCell* newCell = new QWshCell();
            int currentRow = data.at(i).value("sTag").toString().toInt() - 1;
            _data[currentRow].resize(_vHeaders.size());
            for (int j = 0; j < data.at(i).count(); j++)
                newCell->setValue(data.at(i).field(j).name(), data.at(i).field(j).value().toString());
            newCell->cellStyle().parseInputString();
            _data[currentRow][testTagPos(data.at(i).value("tTag").toString())] = newCell;
        }
    qDebug() << "after model" << QTime::currentTime().toString("mm:ss.zzz");
Код:
before sql "16:57.813"
after sql "17:04.676"
before model "17:04.677"
after model "17:11.416"
Код:
QVector<QVector< QPointer<QWshCell>>> _data
В крайнем случае буду думать, что ARM 1GHz не вывозит быстрее))
Записан
Bepec
Гость
« Ответ #13 : Октябрь 02, 2016, 17:28 »

Отключите обновление таблицы на момент заполнения данными, время должно сократиться.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Октябрь 02, 2016, 17:31 »

А для чего это перекладывание?
Вы получаете QWshDatabase::SqlRecordsList data, вот и храните этот список, и данные берите от туда, когда вьюшка их будет спрашивать через data().
Что достигается этим копированием из data в _data?
« Последнее редактирование: Октябрь 02, 2016, 17:33 от Old » Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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