![]() |
|
|
![]()
|
|
| loneybibi |
|
||||||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Сразу скажу спасибо тем, кто осилит прочитать и понять мою тему, а так же за ваши ответы,
помощь и подсказки! Есть дерево QTreeWidget с набором элементов чуть больше 12000 в трех уровнях, которое содержит список географических локаций (страны, регионы, города), выглядит примерно вот так:
Написал для этого всего редактор, в котором можно редактировать дерево сохранять в файл и соответственно читать эту базу из файла. Сохраняю содержимое дерева в базу данных QSQLITE. Вообщем то все работает, но не так как хотелось бы. Полный проект вместе с базой гео-локаций прикрепил к теме. Функции чтения и записи в файл две последние в mainwindow.cpp. Исходники с комментариями! Есть несколько вопросов: 1. Как проверить что все элементы в дереве имеют 3 уровня вложений, то есть как приведено выше (страна, регион, город). Я конечно понимаю что можно перебрать вручную все дерево в цикле, но может можно как то это сделать более оптимально? 2. В программе есть функция записи в файл. Запись осуществляется перебором всех элементов в цикле(рекурсивно), где берется его имя, индекс и заноситься в базу. Но при таком количестве это происходит ужасно медленно (приблизительно 2 минуты), учитывая то что это файловая база! Те же действия в MySql происходят на половину быстрее. Почему так? Особенности драйвера или работы с QSQLITE? Возможно кто то подскажет как оптимизировать мою функцию или это нормально для такого количества? ЧЯДНТ ? 3. Тоже самое и с функцией чтения! Опять же происходит это в цикле (рекурсивно) где читаются элементы и каждый добавляется в дерево. Хотя это и занимает до 5 секунд, я думаю что можно как то сделать это намного быстрее! Подскажите пожалуйста! 4. Сталкивались вы с таким же вопросом? Как хранили данные? Какие форматы использовали? Например я думал о XML но с ним никогда не работал! Будет ли он быстрее и сложно ли с ним построить такое дерево? Еще думал про CSV формат но не хотелось писать парсер файла загоняющий данные в модель таблицы (с ней удобнее работать и строить дерево). Что не понятно спрашивайте попробую правильней объяснить. Вообщем кто что подскажет или поделиться чем то, буду признателен! Функция записи дерева в файл:
Функция чтения базы из файла и построения дерева:
Это сообщение отредактировал(а) loneybibi - 3.12.2012, 05:18 Присоединённый файл ( Кол-во скачиваний: 5 )
location_project.zip 476,74 Kb-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
||||||
|
|||||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Up!
Удалось улучшить алгоритм записи дерева в базу данных! Время записи сократилось с 2 минут до 1.2 секунды. Проблема со скоростью чтения осталась так что подсказывайте! Полный проект прикрепил к посту! Все проблема была в особенностях настроек драйвера SQLITE. Вообщем как известно все настройки по умолчанию да и цель разработчиков этой БД, это очень высокая надежность и отказоустойчивость! Вообщем суть в том что при каждой операции вставки строки данных в таблицу, SQLITE вызывает не явную транзакцию для надежности сохранения данный. А так как драйвер SQLITE физически не может делать более ~50 транзакций в секунду, соответственно и была такая низкая скорость записи. Отсюда вывод начинать свою транзакцию вручную явно, и только после этого запихивать данные! Еще рекомендуется (но я не сделал, кто сделает напишите об улучшениях или изменениях) вставлять данные порциями не более 1000 записей например. Чтиво рекомендуемое к прочтению для познания тонких моментов SQLITE : http://habrahabr.ru/post/149356/ Код новой функции записи:
Это сообщение отредактировал(а) loneybibi - 4.12.2012, 11:30 Присоединённый файл ( Кол-во скачиваний: 8 )
location_project.zip 477,01 Kb-------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
Есть подозрение, что тормозит не БД, а перерисовка списка при каждой вставке. Попробуй перед циклом создать QList<QTreeWidgetItem *>, в цикле вставлять только в него, а после цикла вызвать addChildren И ещё: есть подозрение, что 12000 айтемов одновременно никакому юзеру не нужно. М.б. сделать комбо-бокс со странами, а в лист-вью уже выводить только данные выбранной страны (желательно загрузить их из БД сразу все, а при изменении комбо-бокса только делать clear и addChildren) -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
Да я тоже почти уверен что пользователю это не надо! QComboBox для страны, региона и города(и пока этот вариант полностью устраивает)! Но думал вместо трех комбо сделать один с выпадающим деревом и поиском по нему, так сказать что бы сэкономить место UI.. Да и еще не решил будет ли это полезно и удобней! А вообщем просто интересно как и что по крайней мере для себя знать что и почему. Спасибо за ответ буду что то пробовать вечером делать! -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| loneybibi |
|
|||
|
Любитель ![]() ![]() Профиль Группа: Участник Сообщений: 257 Регистрация: 28.5.2010 Где: Донецк (Украина) Репутация: 3 Всего: 3 |
UP!
Пробовал вариант предложеный borisbn.. Не помогло и даже ухудшило время загрузки списка .. Может кто еще что подскажет... Кстати у кого нить нет случаем такого же списка только на английском? Поделитесь пожалуйста или подскажите где взять ? -------------------- Red Hat Fedora 17 Qt 4.8.1 (x64), GCC 4.4.3, G++ 4.4.3, QtCreator 2.4.1 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 23 Всего: 72 |
Обычно при отрытии дерева (используйте QTreeView + свою модель, а не QTreeWidget) загружаются только корневые узлы, если их много - только первые 100 или 256. остальные загружаются через fetchMore(), когда пользователь скроллит вниз.
Дочерние элементы загружаются при раскрытии их узлов. Для загрузки можно пользоваться QSqlTableModel. NB: она по select() тоже загружает не всё, для загрузки остатка вызывайте canFetchMore() и fetchMore(). |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |