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

Вниз

Оптимальное хранение 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
3-67128
DenKop
2003-04-01 22:23
2003.04.21
SQL, Поиск строки независимо от регистра


4-67628
DALEX
2003-02-22 20:29
2003.04.21
Не работает ENUMPrinters : почему-то возвращает 0 ?


1-67336
kull
2003-04-08 13:24
2003.04.21
Не наследуется форма! :(


1-67212
dolmat
2003-04-10 17:23
2003.04.21
RichEdit строки различным цветом програмно


3-67151
Enty
2003-04-03 12:05
2003.04.21
Ошибка изменения длинных символьных полей





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский