Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

Оптимальное хранение StringList в памяти.   Найти похожие ветки 

 
Карелин Артем ©   (2003-04-11 07:36) [0]

Сделал в программе функции инкрементального поиска данных при вводе данных (как в IE при наботе адреса). Данные для подстановки загружаются из базы 1 раз, но в нужные контролы (у них свои списки) передаются при показе нужной формы. Списков много, данных в них тоже много.
Как оптимальнее хранить списки, чтобы расходы памяти были не слишком большие и вместе с тем быстро загружались в контролы?


 
Digitman ©   (2003-04-11 10:30) [1]

Видимо, придется разработать свои визуальные списочные контролы (работающие со списками на базе TStringlist). Например, TSpecialComboBox = class(TCustomCombobox). Иначе неразумные затраты памяти и ограничения в производительности (из-за бесконечных операций копирования и перераспределения памяти под элементы-строки) вряд ли удастся обойти.

Скажем, строка TargetComboBox.Items := SourceStringList приводит к созданию в "недрах" ComboBox"а точной копии оригинального списка, хотя все что нужно в данном случае - просто сослаться на существующий оригинальный объект-список (благо изменяться он с момента загрузки выборкой из БД и на всем протяжении работы приложения не будет). К сожалению, защищ.метод SetItems - не виртуальный и это несколько осложнит задачу наследования компонента. Сложность может еще возникнуть и в случае мультипоточного доступа к методам/св-вам оригин.списка. Но в принципе - все решаемо, и не так уж и сложно, особенно если делать ставку на немодифицирование содержания ориг.списка в момент пока существуют контролы. на него ссылающиеся.


 
malkolinge ©   (2003-04-11 11:15) [2]

Лично мне НЕ нравиться как сделаны списки в делфи. Это и не списки а массивы ! Я бы писал Свой список с нуля. Сделал бы ему предка в виде TPersistenta И полностью бы перекрыл свойство Items.

Теперь, касаемо обновления - ИМХО лучше всего попытаться использовать древовидную структуру БД. Хотя я отлично понимаю, что это наверняка УЖЕ не реально.


 
Digitman ©   (2003-04-11 11:28) [3]


> malkolinge


да нормально они реализованы ! просто всех задач, требуемых программисту для решения, учесть невозможно


 
malkolinge ©   (2003-04-11 11:38) [4]

Нет меня на программировании еще на первом курсе учили КАК сделать список. :) А посмотрите, что сделано у Борланда в этом направлении :)


 
Digitman ©   (2003-04-11 12:31) [5]


> malkolinge


Борланд преследовал совершенноть иные цели, разработав и предложив эти классы/компоненты !)

А на первом курсе твое внимание, видимо, не заостряли на том, что делая классический список (с выделением/освобождением памяти под каждый эл-т индивидуально, думаю, это были New()/Dispose()), ты во многих случаях, во-первых, проигрываешь Борландовским алгоритмам по эффективности операций с памятью, во-вторых, неразумно дефрагментируешь адр.пространство, контролируемое встроенным менеджером памяти


 
Palladin ©   (2003-04-11 12:38) [6]


> malkolinge © (11.04.03 11:38)

твое понятие списка, это ТВОЕ понятие спика...
меня тоже много чему учили...
но применять то или иное нужно исходя из ситуации


 
Digitman ©   (2003-04-11 12:49) [7]


> Palladin (11.04.03 12:38)


совершенно верно !


 
malkolinge ©   (2003-04-11 17:26) [8]


> Digitman ©

Я с вами абсолютно согласен в плане того, что выбор решения зависит от ситуации. Но Борландовский список занимает НАМНОГО больше места ( я не имею ввиду затраты на инкапсуляцию его в класс). Там как никак статический массив МАксимальной длинны указателей используеться.


 
Palladin ©   (2003-04-11 17:46) [9]


> malkolinge © (11.04.03 17:26)

нет не статический, рассмотри получше исходники...
и заметь что есть свойство Capacity...


 
Anatoly Podgoretsky ©   (2003-04-11 17:50) [10]

malkolinge © (11.04.03 17:26)
Твоя реализация требует намного больше памяти, времени на обработку списка и неэффективна в сущности.
У Борланда очень эффективная реализация, к тому же можно управлять этой эффективностью.

Как было сказано в ожной рекламе - Вы просто не умеете их готовить.


 
malkolinge ©   (2003-04-11 17:53) [11]

Да вижу..Правда где это свойство по умолчанию задаеться пока не нашел....но ищу :))


 
malkolinge ©   (2003-04-11 17:57) [12]


> Твоя реализация требует намного больше памяти, времени на
> обработку списка и неэффективна в сущности.

Идея была в том, чтобы создать свой список. Это обычный пример, как правильно было замечено достаточно тривиальный и с массой недостатков


> У Борланда очень эффективная реализация, к тому же можно
> управлять этой эффективностью.


Если б я в этом сомневался, то писал бы на Вижуале


> Как было сказано в ожной рекламе - Вы просто не умеете их
> готовить.

Спасибо за оказанное доверие :)


 
Serginio   (2003-04-11 18:22) [13]

Может я что то не понял. Но такую проблему легко решать при помощи отсортированного TStringList. Если нужно его можно привязать к конкретному контролу. А в выпадающий список копировать по неполнрму совпадению которые лего отискиваются половинным делением. По поводу списков в Delphi которые по сути являются наследниками TList тоесть практически динамчекие массивы то здесь палка о двух концах. Самый большой недостаток это реаллоки которые при больших списках могут вызывать ошибку выделения памяти (из-за дефрагментации) борьба с этим явлением либо зная наперед какой размер списка сразу выделять (Capacity) либо переходить на дискретные (страничные списки в виде дерева либо динамического массива страниц).



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

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.021 c
14-67444
Evgeny
2003-04-04 07:07
2003.04.21
метод POST


1-67244
NikB
2003-04-10 12:01
2003.04.21
Problema s Transparent u tImageList.


14-67538
Max11111
2003-04-04 15:22
2003.04.21
Про методы


8-67394
ГС ТОФ
2003-01-21 13:34
2003.04.21
Печать растровых изображений


1-67320
Sectey
2003-04-08 13:38
2003.04.21
Как заставит другую программу(процесс) записывать данные?