Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Вниз

Комфортно работать с большими treelistview   Найти похожие ветки 

 
12 ©   (2010-11-10 12:10) [0]

в программе должно быть 10 деревьев, число нодов, соответственно, штук
310002
254951
690114
413616
173786
591637
395267
657713
408273
571554
построил минимальное дерево (173786 штук) и поскучнело как то сразу

а еще учесть, что программа будет на одном компьютере работать, куда удаленно будут заходить в среднем до 5 юзеров одновременно..

Хорошо, дерево можно строить по мере раскрытия ветки.
Но первый раз требуется именно все ветки открывать - это потом юзеры сами распихают ноды по другим нодам

Но, опять же, пусть  даже 20% нодов-веток, все равно останутся корневыми..

что мне можно посоветовать, кроме как не спамить :)


 
clickmaker ©   (2010-11-10 12:17) [1]

virtualmode?


 
Sergey13 ©   (2010-11-10 12:21) [2]

Откуда дровишки, т.е. деревья? 8-)
ИМХО надо как то продумывать интерфейс и логику работы с данными, чтобы уйти от таких сумашедших (для деревьев) цифирей.
Без описания задачи что-то более конкретное советовать трудно.


 
12 ©   (2010-11-10 12:38) [3]


> ИМХО надо как то продумывать интерфейс и логику работы с
> данными

надо..
второй день пошел - ничего


> Откуда дровишки

клиенты шараги, по отделениям,  по России
т.е. фирма, допустим,  может иметь несколько дочерних, вот они ее ветки будут.
у тех, соответственно тоже.
или просто одна фирма несколько раз зарегистрирована - их, логически, тоже как ветки для ветки.имя=любая_из_них надо покзывать


 
12 ©   (2010-11-10 12:44) [4]


> virtualmode?

не понял мысль


 
Медвежонок Пятачок ©   (2010-11-10 12:47) [5]

http://www.soft-gems.net/index.php?option=com_content&task=view&id=12&Itemid=33

Хоть мульон узлов.
Стресс тест демо показывает на атлоне 650 мгц 256 мб рам ~ 850ms на загрузку


 
Jeer ©   (2010-11-10 12:52) [6]

В свое время тоже встала такая задача.
Решил изменением способа построения дерева: от рекурсивного через поиск дочек к линейному, используя отдельное поле Level, соответствующее уровню текущей node.
Скорость выросла более чем на порядок.


 
Медвежонок Пятачок ©   (2010-11-10 12:56) [7]

рекурсивная загрузка из бд конечно тормозит, но он вроде про уже загруженное и очень неторопливое дерево говорит.


 
12 ©   (2010-11-10 13:49) [8]


> Медвежонок Пятачок ©   (10.11.10 12:56) [7]
>
> рекурсивная загрузка из бд конечно тормозит

не, именно она нужна
откуда ж еще по поллимона строк взять


 
Jeer ©   (2010-11-10 13:52) [9]


> не, именно она нужна


Я ж говорю - она не нужна :)


 
12 ©   (2010-11-10 13:57) [10]


> Я ж говорю - она не нужна :)

я понял :)

все равно долго.

 smrtqry1.Open;
 tv1.Items.BeginUpdate;
 while not(smrtqry1.Eof) do
 begin
    tv1.Items.AddChild(nil,smrtqry1.FieldList[0].AsString);
    smrtqry1.Next;
 end;
 tv1.Items.EndUpdate;

просто, ничего не вычисляя, и уже неприемлимо.

Вот думаю, может, гридом, с кол-вом пробелов перед именем, соответственно уровню вложения..


 
RWolf ©   (2010-11-10 14:06) [11]

зачем всё-то загружать? юзер больше пары десятков одновременно всё равно не видит. листнули окно — подгрузили следующую порцию, профит.


 
12 ©   (2010-11-10 14:16) [12]

> зачем всё-то загружать?
а если листанули до конца?
а если из начала node drag&dropом понесли в конец, а потом полученную ветку в середину?
в начале эксплуатации так и будет..

Вот думаю, может, гридом с кол-вом пробелов перед именем, соответственно уровню вложения
DAO очень хорошо работает, со стандартным dbGrid, как-то fetchит именно порциями так, что тормозов особо и не видать


 
RWolf ©   (2010-11-10 14:21) [13]


> а если листанули до конца?а если из начала node drag&dropом
> понесли в конец, а потом полученную ветку в середину?

не вижу ничего страшного. листанули до конца — с конца и подгрузим те же два десятка строчек.
а тянуть драг-н-дропом через стотыщ строк ни один юзер не осилит.


 
clickmaker ©   (2010-11-10 14:25) [14]

> а если из начала node drag&dropом понесли в конец, а потом
> полученную ветку в середину?

это при таком количестве нодов, как в [0]?
а юзер не охренеет?


 
Медвежонок Пятачок ©   (2010-11-10 14:28) [15]

Вот думаю, может, гридом

я же привел реальный пример, когда миллион узлов создается быстро и непринужденно. и само дерево после этого не тормозит.


 
12 ©   (2010-11-10 14:40) [16]


> это при таком количестве нодов, как в [0]?
> а юзер не охренеет?

придется не охреневать. А чего делать..  
Вообще-то, может какой-нить контейнер сделать, типа, кинул туда, он там, как в буфере обмена, домотал до нужного места и из буфера его туда..


> само дерево после этого не тормозит.

дык, само дерево TTreeView; и не тормозит после построения. Вернее, приемлемо тормозит.

построение списка занимает в 50 раз больше времени, чем запрос.
с гридом, вообщем, самое то. FethRows = 1000 и почти летает. Почти :)
Как он это делает.. надо бы разобраться, конечно.


 
clickmaker ©   (2010-11-10 14:43) [17]

> придется не охреневать. А чего делать..  

и неужели никак не разгруппировать такую туеву хучу данных? уровнем повыше тривью. фильтром, например, или по закладкам раскидать


 
Медвежонок Пятачок ©   (2010-11-10 14:46) [18]

построение списка занимает в 50 раз больше времени, чем запрос.

Ну и при чем здесь тогда вообще тривью в вопросе?


 
Медвежонок Пятачок ©   (2010-11-10 14:50) [19]

Как он это делает.. надо бы разобраться, конечно.

Он тупо фетчит данные ни о чем не заботясь.
А ты либо рекурсивно посылаешь множество запросов, либо используешь один линейный датасет, и время тратится на поиски парентов плюс создание самих узлов.

сделай простое исследование.
возьми тот же самый линейный датасет с тем же количеством строк и прсто загрузи его в дерево в котором все узлы будут чайлдами в первом поколении от единственного рута.

сразу увидишь что именно тормозит.


 
Sergey13 ©   (2010-11-10 14:55) [20]

> [3] 12 ©   (10.11.10 12:38)
> клиенты шараги, по отделениям,  по России
> т.е. фирма, допустим,  может иметь несколько дочерних, вот
> они ее ветки будут.
> у тех, соответственно тоже.
> или просто одна фирма несколько раз зарегистрирована - их,
> логически, тоже как ветки для ветки.имя=любая_из_них надо
> покзывать

1 вариант. Судя по вышепроцитированному, структура должна быть похожа на проводник и файловую систему, когда п 90% данных лежат на последнем уровне. Если их вывести из "дерева" и класть рядом, в гриде например, то нагрузка на дерево снизится.
2 вариант. Разбить одно дерево на несколько по следующей схеме. Сначала строится "супер дерево" например с областями страны (ну или как там у тебя), на конце которого, вместо "листиков" растут обособленные деревья, которые описывают какую то обособленную группу, типа твоих дочерних фирм.

Вобщем суть идей - сократить объем за счет дробления до разумных пределов.

ЗЫ: сумбурно как то получилось, сори.


 
12 ©   (2010-11-10 14:57) [21]


> сделай простое исследование.
> возьми тот же самый линейный датасет

дык я про что

 c1 := GetTickCount;
 smrtqry1.Open;
 c2 := GetTickCount;
//  tv1.Items.BeginUpdate;
//  while not(smrtqry1.Eof) do
//  begin
//     tv1.Items.AddChild(nil,smrtqry1.FieldList[0].AsString);
//     smrtqry1.Next;
//  end;
//  tv1.Items.EndUpdate;
 c3 := GetTickCount;
 FmtStr(s, "%d тиков запрос, %d тиков построение, %d тиков всего",[c2-c1, c3-c2, c3 - c1]);
 mmo1.Lines.Add(s);

и в 50 построение дольше запроса.


> > придется не охреневать. А чего делать..  
> и неужели никак не разгруппировать такую туеву хучу данных?

Как?
1. по алфавиту, на каждую букву, если на отдельной вкладке
2. или просто запретить весь список строить. Пусть введут хотя бы 2-3 буквы, для начала.


 
Медвежонок Пятачок ©   (2010-11-10 15:02) [22]

дык я про что

ну а я про виртуал три вью и лимон узлов за меньше чем секунда.

а сколько времени занимает  непосредственно сам while not eof do next;?
без возни с деревом?


 
12 ©   (2010-11-10 15:03) [23]

Еще раз.
Наверное не понятно и неточно написал первый раз.
Наследие такое - Большая плоская таблица.
Надо перегнать в структуру-дерево.
Нет пока признаков никаких, кроме того, что каждый менеджер знает своих клиентов. (правда, в 90% случаев название схожие, глаз определит)


> Вобщем суть идей - сократить объем за счет дробления до
> разумных пределов.

правильно!
но!, кто решит кто куда относится, кроме менеджера. Вот им и надо сделать инструмент, чтоб они сами сформировали такой список.


 
clickmaker ©   (2010-11-10 15:04) [24]

> 2. или просто запретить весь список строить. Пусть введут
> хотя бы 2-3 буквы, для начала.

как вариант - да, автокомплит. Причем, данные подтягивать с сервака (из базы) в момент запроса, а не все сразу фетчить на клиент.

Не совсем понятно, зачем юзеру одномоментно весь этот лес видеть одним взором?
Ведь он же в текущий момент с одной фирмой работает, нет?


 
RWolf ©   (2010-11-10 15:08) [25]

согласен с [22] — VirtualTreeView решит все проблемы.
главное — выбрать правильный контейнер для хранения дерева в памяти.


 
Sergey13 ©   (2010-11-10 15:09) [26]

> [23] 12 ©   (10.11.10 15:03)
> но!, кто решит кто куда относится, кроме менеджера. Вот
> им и надо сделать инструмент, чтоб они сами сформировали
> такой список.

Сейчас менеджеры как то работают с этим? Не со всей же "Большой плоская таблица" в одном гриде?


 
12 ©   (2010-11-10 15:09) [27]


> а сколько времени занимает  непосредственно сам while not
> eof do next;?
> без возни с деревом?

ну, конечно,  и даже на пару порядков меньше, если так
 while not(smrtqry1.Eof) do
 begin
    //tv1.Items.AddChild(nil,smrtqry1.FieldList[0].AsString);
    smrtqry1.Next;
 end;


 
Медвежонок Пятачок ©   (2010-11-10 15:09) [28]

контейнер там нужен будет не для дерева, а для узла дерева.
само дерево - оно само по себе контейнер дерева.


 
Медвежонок Пятачок ©   (2010-11-10 15:11) [29]

ну, конечно,  и даже на пару порядков меньше, если так

То есть тормозит уже сам тривью при его наполнении. независимо от того, насколько быстро поставляются данные для его загрузки.


 
12 ©   (2010-11-10 15:20) [30]


> Сейчас менеджеры как то работают с этим? Не со всей же "Большой
> плоская таблица" в одном гриде?

с большой таблицей, ибо бардак :)
только накладывая фильтр по названию клиента и региону
where name like :L
and region = :R


> VirtualTreeView

Убедили, сейчас гляну ..


 
Jeer ©   (2010-11-10 15:34) [31]


> 12 ©   (10.11.10 15:20) [30]
>
>
> > Сейчас менеджеры как то работают с этим? Не со всей же
> "Большой
> > плоская таблица" в одном гриде?
>
> с большой таблицей, ибо бардак :)


Тогда присоединяюсь к мнению или уточняю его, что неверна постановка работы пользователей + не ограничен интерфейс.


 
clickmaker ©   (2010-11-10 15:34) [32]

> Наследие такое - Большая плоская таблица.
> Надо перегнать в структуру-дерево.

т.е. раскидать филиалы по фирмам?
ну можно завести два списка, в каждом из которых эта плоская таблица, отсортированная по именам, и перетаскивать из левого в правый на элемент-родитель, убирая из левого.
списки снабдить фильтром для быстрого поиска или урезания, либо разбить по алфавиту на закладки


 
Sergey13 ©   (2010-11-10 15:35) [33]

> [30] 12 ©   (10.11.10 15:20)
> с большой таблицей, ибо бардак :)
> только накладывая фильтр по названию клиента и региону

ИМХО если им в это рабочее место добавить простановку нужных параметров и одновременно предложить им новый интерфейс, использующий эти параметры, то в скором времени сами все разнесут.


 
Jeer ©   (2010-11-10 15:40) [34]

Это практическая постановка для OLAP-систем, чем я занимаюсь крайние 6 лет.
Создаются таблицы-измерений ( справочники ) по которым и нарезается конкретная плоская ( двумерная ) таблица из гиперкуба.
Обычно достаточно размерностей 7 плюс-минус 2..3


 
Jeer ©   (2010-11-10 15:46) [35]

К примеру, для социо-экономических показателей, как показала практика, достаточно следующих таблиц-измерений ("деревянных"):
- регион;
- источник информации;
- ОКВЕД;
- период;
- способ учета;
- системы показателей;
- показатели;


 
12 ©   (2010-11-10 15:57) [36]

VirtualTreeView - вещь!
Все, спасибо всем! И особенно, МП :)


> т.е. раскидать филиалы по фирмам?

нет, они, в принципе, раскиданы.
Раскидать по дочерним/подчиненным надо.

Дерево всех в филиале,
с "карманом" где-то слева/справа от дерева, самое то.


> ИМХО если им в это рабочее место добавить простановку нужных
> параметров и одновременно предложить им новый интерфейс,
>  использующий эти параметры, то в скором времени сами все
> разнесут.

тоже об этом говорил, пусть разметят, потом одним запросом и сделаем дерево.
Но все филиалы используют "свой софт" :) для этого.
Это всем разослать переходную приблуду, нормальную.

Надо сразу нормальную. с возможностью перемещать ноды.
Потом фирмы сольются/разделятся - функционал уже есть. Мышой перетащат и делов то..


 
12 ©   (2010-11-10 17:07) [37]

VirtualTreeView - вещь!!
да он даже понятнее в методах, логичнее, имхо


 
Jeer ©   (2010-11-10 17:27) [38]


> да он даже понятнее в методах, логичнее, имхо


Странно, что ты раньше внимание не обратил.
Mike Lischke надо знать в лицо :)



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2011.02.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.021 c
2-1290760671
Scott Storch
2010-11-26 11:37
2011.02.20
out- параметр интерфейс


2-1290846549
Чайник
2010-11-27 11:29
2011.02.20
Удалить файл


15-1287691449
bss
2010-10-22 00:04
2011.02.20
Проектирование БД


11-1230410385
osteroid83
2008-12-27 23:39
2011.02.20
Что с kolnmck.ru


2-1291043471
Сергей
2010-11-29 18:11
2011.02.20
Как прочитать данные xml файла?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский