Название: QSqlTableModel + SQLite ооочень медленно Отправлено: kuzulis от Октябрь 19, 2016, 20:42 Всем привет.
Собственно, я слышал, что стандартные SQL модели медленные, но чтобы настолько... :o В общем, имею табличку на 10 записей... Каждые 500 мсек в нее добавляется по одной записи в ячейку от 0 до 9 по очереди. В конце заполнения строки модели делается submitAll(). Так воот, этот QSqlTableModel::submitAll() ну уж оочень медленный.. В моем случае оно занимает 60~100 мсек :o :o :o Это уже становится заметным, например, если взять окошко и начать его таскать по рабочему столу, то в момент коммита данных, его перемещение рывком останавливается (т.е. видно дерганье окошка при перемещении). Так вот, вопрос: это или у меня лыжи кривые или я что-то недопонял. Ниже привожу код и проект, мож кто подскажет что делать... (не писать же все самому с нуля??) = main.cpp = Код
= widget.h = Код
= widget.cpp = Код
Вывод приложения такой: Цитировать Debugging starts spent: 1 spent: 59 spent: 59 spent: 65 spent: 65 spent: 65 spent: 64 spent: 67 spent: 66 spent: 82 spent: 56 spent: 98 Debugging has finished Тестил на Windows 10 & Qt 5.7.0 & MSVC2015 & 32 bit Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: Bepec от Октябрь 19, 2016, 21:10 Могу показаться нубом, но какое время выполнения вы ожидали?
По сути sqlite в момент коммита производит запись на диск данных. Т.к. у неё нет собственного процесса, всё это происходит в момент коммита. Следовательно 60+ мс это время занесения записи в бд и записи на диск. И скорее всего у вас HDD. Ибо вот мой лог: Цитировать Отладка запущена spent: 0 spent: 7 spent: 7 spent: 4 spent: 5 spent: 6 spent: 6 spent: 8 spent: 6 Отладка завершена PS интересно кстати, как вариант, попробовать перенести модель в отдельный поток. Хотя тема о переносе поднималась, вроде никто результатов не озвучивал. Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: lit-uriy от Октябрь 20, 2016, 06:16 можно попробовать submit обернуть в транзакцию
Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: kuzulis от Октябрь 20, 2016, 08:54 Цитировать И скорее всего у вас HDD. Ну да, рабочий комп у меня еще Тутанхамона видел. И это плюс, т.к. на нем сразу видны все узкие места приложения. :) Цитировать Следовательно 60+ мс это время занесения записи в бд и записи на диск. Да ну, не верю, не может запись пары десятков байт занимать 60 мсек.. Да и ваши 6-8 мсек - это, ИМХО, оочень много. Цитировать интересно кстати, как вариант, попробовать перенести модель в отдельный поток. Брр... это не то на что я расчитывал изначально, т.к. это добавляет геммороя. Цитировать можно попробовать submit обернуть в транзакцию А каким образом? ::) Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: kuzulis от Октябрь 20, 2016, 09:16 UPD: Только что проверил на домашнем компе (с HDD), но под линукс.
Qt 5.7.0 & GCC 6.2.1 & 64 bit: Цитировать spent: 0 spent: 35 spent: 60 spent: 51 spent: 65 spent: 65 spent: 71 spent: 63 spent: 29 spent: 44 spent: 35 spent: 60 spent: 33 spent: 58 Qt 4.8.7 & GCC 6.2.1 & 64 bit: Цитировать spent: 0 spent: 31 spent: 30 spent: 63 spent: 28 spent: 52 spent: 35 spent: 50 spent: 32 spent: 57 spent: 30 spent: 47 spent: 29 spent: 53 Рывков вроде не наблюдаю. Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: Bepec от Октябрь 20, 2016, 12:13 Т.к. транзакции в модели забиты где то далеко и нудно, я попробовал снизить уровень безопасности sqlite.
Достигнуто кодом Код: { Цитировать Отладка запущена spent: 0 spent: 6 spent: 2 spent: 1 spent: 2 spent: 2 spent: 1 spent: 1 spent: 2 spent: 1 spent: 2 Отладка завершена Можно ещё поиздеваться и изменить флаг temp_store Код: { Цитировать Отладка запущена spent: 0 spent: 1 spent: 2 spent: 1 spent: 1 spent: 1 spent: 1 spent: 1 spent: 1 spent: 1 spent: 2 spent: 1 spent: 2 Отладка завершена PS по умолчанию sqlite работает в драконовском режиме безопасности, но это гарантирует отсутствие потери данных. PPS вероятно, он ожидает окончания записи файла на диск, и производит проверку результата. Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: lit-uriy от Октябрь 20, 2016, 14:09 >А каким образом?
QSqlDatabase QSqlTableModel::database() bool QSqlDatabase::transaction() QSqlDatabase::commit() Однако, если модель действительно сама создаёт транзакции, то будут проблемы Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: Bepec от Октябрь 20, 2016, 14:49 Транзакция у меня на машине увеличила время обработки до 8 мс ...
Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: Vamireh от Октябрь 23, 2016, 21:06 Когда работал с SqlLite до начала запросов выполнял "BEGIN;", а после "COMMIT;" Во всяком случае в этом конкретном примере spent с 79-102 упал до 1-2. Правда, в случае краша приложения потеряем все.
Название: Re: QSqlTableModel + SQLite ооочень медленно Отправлено: kuzulis от Октябрь 25, 2016, 10:30 О, погуглив, набрел на такую "фишку" SQLite как режим WAL (http://www.sqlite.org/wal.html)
Включать вроде как-то так (вроде как поддерживается для SQLite > 3.7.0): Цитировать sql.exec("PRAGMA journal_mode = WAL") но я сам еще не пробовал. :) PS: На этом форуме уже была похожая тема (http://www.prog.org.ru/topic_25974_0.html), но я так и не понял, заработало оно или нет. |