|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
||||||
TreeView. Как ускорить построение дерева27.09.2018, 10:33. Показов 4329. Ответов 20
Источник данных: - БД MSAccess;
Таблица - > 1 000 000 записей; Поля таблицы см. скрин; Количество корневых узлов - ~100 штук; Количество уровней - не ограничено; Размер БД - 55 Мб; Код Кликните здесь для просмотра всего текста
Запускаю отладку. Файл решения (*.exe) начинает расти более 500Мб. и долго запускается. Результата я так и не дождался. Вопрос. Как оптимизировать код загрузки дерева?
0
|
||||||
| 27.09.2018, 10:33 | |
|
Ответы с готовыми решениями:
20
TreeView: построение дерева на основе данных из БД Oracle 11g xe
|
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|
| 27.09.2018, 11:06 [ТС] | |
|
TreeView
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 27.09.2018, 11:12 | ||
|
При раскрытии узла подгружайте из базы еще один-два дочерних уровня. При закрытии узла элементы можно удалять для экономии памяти.
1
|
||
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|||
| 27.09.2018, 11:37 [ТС] | |||
|
TreeView
Это делать запросом или кодом (сделать счётчик какой-нибудь)? Или кодом и запросом? Я так понимаю, что нужно удалять дочернии узлы...
0
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 27.09.2018, 15:37 | |||
|
Во многом жизнь станет проще.
1
|
|||
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|
| 27.09.2018, 15:51 [ТС] | |
|
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 27.09.2018, 16:43 | |||||||
Сообщение было отмечено Soft17 как решение
РешениеВ нем подключение к базе производится с помощью Entity Framework. В файле app.config в 24-й строке пропишите путь к вашему файлу Access:
Data source вместо SampleDb.accdb укажите путь к вашему файлу.В папке Model лежит класс DbEntry, который дублирует (или пытается дублировать) структуру вашей таблицы — на каждую строку в таблице будет создаваться этот экземпляр. В файле SampleContext лежит код, где каждое свойство класса привязывается к колонке в таблице. Обработку ошибок не делал — это допилите сами, там лишь простой пример асинхронной подгрузки каждого уровня.
1
|
|||||||
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|
| 27.09.2018, 17:12 [ТС] | |
|
kolorotur,
Огромное спасибо. Буду разбираться. У меня выдаёт ошибки. Как их устранить? SampleContext.OnModelCreating(DbModelBui lder) : не найден метод пригодный для переопределения. "DbContext" не содержит конструктор, который принимает аргументы 1. "SampleContext" не содержит определения для "Database" и не удалось найти метод расширения "Database", принимающий тип "SampleContext" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку). "SampleContext": тип, использованный в операторе using, должен иметь неявное преобразование в System.IDisposable. Имя "Database" не существует в текущем контексте. Не удалось найти тип или имя пространства имен "DbContext" (возможно, отсутствует директива using или ссылка на сборку). Не удалось найти тип или имя пространства имен "DbModelBuilder" (возможно, отсутствует директива using или ссылка на сборку). Не удалось найти тип или имя пространства имен "DbSeto" (возможно, отсутствует директива using или ссылка на сборку). Тип или имя пространства имен "Entity" не существует в пространстве имен "System.Data" (возможно, отсутствует ссылка на сборку). Тип или имя пространства имен "Entity" не существует в пространстве имен "System.Data" (возможно, отсутствует ссылка на сборку).
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 27.09.2018, 17:18 | ||
|
В настройках студии в категории NuGet Package Manager отметьте галочку чтобы он автоматом восстанавливал зависимости при построении проекта. Tools -> Options, дальше как на картинке.
1
|
||
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|
| 27.09.2018, 17:34 [ТС] | |
|
kolorotur,
Вроде всё нормально Не могли бы вы ещё раз посмотреть, что не так. При первом запуске окно выскакивало. (см. скрин) Я нажал "ок", т.е. выбрал первый пункт.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 27.09.2018, 17:42 | |
|
Первая картинка: выберите второй пункт. Да и вообще, не забывайте обновлять студию
![]() Как вариант, понизьте целевую платформу проекта до 4.6, но тогда возможно придется переустановить зависимости под ту же версию. Вторая картинка: вверху на желтоватом фоне справа должна быть кнопка "Восстановить".
1
|
|
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
||||||||||||
| 27.09.2018, 20:20 [ТС] | ||||||||||||
|
Ошибки пропали. Запускаю проект. Открывается пустое окно. Прописал путь к БД App.config
SampleContext.cs
Прилагаю базу "Tree View_01.zip" (может пригодится)
0
|
||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 27.09.2018, 21:42 | |||
![]() Добавлено через 39 минут Глянул. Вы в таблице для колонки с Id родителя используете значение 0 если родителя нет. Подход неправильный, надо использовать null, но если иначе никак, то в 24-й строке передавайте не null, а 0.
1
|
|||
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
||
| 27.09.2018, 21:52 [ТС] | ||
|
Да вроде есть... Поэтому и базу приложил.. на случай если у меня "затмение"...
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 27.09.2018, 22:00 | |
|
Soft17, исправьте таблицу или передавайте 0.
1
|
|
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
||||||||
| 27.09.2018, 22:18 [ТС] | ||||||||
Сделал так: в базе данных заменил на "0" на пустое значение. Код работает. Дерево строится недостаток: несколько медленно происходит загрузка большой таблицы (5-10 с.) Хотя вряд ли такое большое дерево будет использоваться, но всё же... PS На счёт "проще", Как-то "проще" не бросается в глаза, глядя на то как "Entity Framework" строит дерево.... Для меня это что-то космическое... Но буду разбираться 1. "Entity Framework" это наиболее эффективная на текущий момент технология работы с базой данных? 2. Вы бы рекомендовали освоить работу с "Entity Framework"? Тот способ работы с базой данных, который я применил в вопросе уже не практикуется?
0
|
||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 27.09.2018, 22:23 | |||||||
|
Для пробы создал таблицу в PostgreSQL и заполнил ее десятью миллионами узлов — выборка уровня производится за 1 миллисекунду. Попробуйте реализовать все это "голым" ADO.Net — ужаснетесь. Если надо выгружать/загружать большие объемы данных, то она не сильно подходит. Если надо работать по принципу "выгрузил сущность, модифицировал, загрузил снова", то работает идеально. Добавлено через 1 минуту Но и никто не запрещает, конечно.
1
|
|||||||
|
5 / 5 / 3
Регистрация: 15.01.2017
Сообщений: 690
|
|
| 28.09.2018, 08:45 [ТС] | |
|
kolorotur,
А как сделать кнопки для перемещения узлов "вверх" ("вниз") по дереву? Я так понимаю, что в таблице нужно сделать отдельное поле для сортировки?
0
|
|
|
burning1ife
|
||||||||||||
| 29.09.2018, 06:38 | ||||||||||||
|
Плюс можно получать не все поля из таблицы а только нужные с помощью Select По сути здесь нужно только Id, Name и кол-во потомков (чтобы показать кол-во и/или добавить + для раскрытия списка). Еще один вариант использовать Dapper, у него лучшая производительность по сравнению с EF. У EF много плюшек вроде кэширования и т.д., но это оставляет след на производительности и если они не используются, то лучше их отключать или использовать другую ORM вроде Dapper. В Dapper будет выглядеть так:
Не по теме: kolorotur, кстати только сейчас узнал, что EF есть провайдер для работы с Access. Но судя по тому, что у них асинхронность "ненастоящая", то так себе реализация :)
1
|
||||||||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||
| 29.09.2018, 14:46 | |||||
![]() А так там проблемы с производительностью из-за самого Access — как я писал выше, если поменять базу на PostgreSQL, то запросы отрабатывают за 1мс с таблицей в десять лямов записей. Если же дергать данные из Access из таблицы с одним миллионом, то запрос выполняется за секунду-полторы. Может, конечно, в этом провайдер виноват или кривые индексы в аксессе. ![]()
1
|
|||||
| 29.09.2018, 14:46 | |
|
Помогаю со студенческими работами здесь
20
Построение иерарх. дерева на основе существующей БД. Как ускорить вывод данных.
Построение дерева TreeView из XML Динамическое построение дерева в TreeView по заданной структуре Парсинг файлов формата IFC и построение дерева TreeView на основе полученных данных Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
|
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
|
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования.
Часть библиотеки BedvitCOM
Использованы. . .
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога
SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
|
|
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|