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

Вниз

TList и память   Найти похожие ветки 

 
LEXA   (2003-01-25 14:28) [0]

Добрый день!
Подскахите плз.
Храня в TListах Recordы и classы в больших количествах (все содран с хелпа). Надо хранить большие объемы часто меняющейся инфы.
Добавляю в TList 100к записей - по таскменеджеру смотрю на прогу - отъела 30М памяти + 30 виртуалки.
Удаляю 50к записей - смотрю на память - все по прежнему ;-(
Как заставить TList освобождать память?

Другая трудность - добавление по однй записи до 100к записей - пару секунд занимает на моем Cel-333, удаление их по одномой записи - в 100 раз медленнее: как бы это обойти?

Ответ гдето видел -но когда понадобилось не могу найти :-(


 
LEXA   (2003-01-25 14:29) [1]

Блин сорри за ошибки ;-(


 
Palladin   (2003-01-25 14:38) [2]

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


 
LEXA   (2003-01-25 14:42) [3]

Освобождаю конечно..
Исходников под рукой нету но...
Чтото типа этого
for i:=1 to 50000 do
begin
MyRecord:=MyList.Items[i];
Dispose(MyRecord);
end
После такого цикла количество Itemов в List получается нужным (50к до этого было 100к) память в таскманагере все еще занимается.


 
Alex Konshin   (2003-01-25 18:41) [4]

Если работаешь с record, то динамический массив будет быстрее, так как под все элементы будет выделен один кусок памяти, и отдаваться он будет тоже одним куском.
Объекты же классов всегда (почти, смотри ниже) выделяются динамически, поэтому здесь использование динамических массивов не дает никакого выигрыша.
Если объекты или записи еще и содержат поля типа String, то и под них тоже выделяется память.
Если же тебе хочется такого же поведения как и с записями, то смотри мои динамические массивы:
unit Arrays на http://home.earthlink.net/~akonshin/index.htm
То есть, в моих дин.массивах объекты располагаются в одном куске памяти друг за другом. Но, естественно, все объекты должны быть одного класса, ну или хотя бы иметь одинаковый размер.
Если же тебе на самом деле эти записи нужны для построения списков, то посмотри там же юнит ChainPools. Этот юнит сам берет и отдает память.
Что же касается освобождения физической памяти, то этим ты управлять не можешь (ну, скажем, почти). Менеджер памяти Delphi берет память страницами(точнее, по много страниц сразу) и отдает он их очень неохотно (если вообще отдает), потому что освободить он может только полностью свободную страницу, но так как у тебя много маленьких объектов, то между ними может быть все что угодно, что живет до конца жизни твоего приложения.
Как с этим можно бороться? Например, если ты знаешь количество записей (хотя бы примерно), то можно самому брать память по VirtualAlloc, но отдавать, соответственно, тоже придется самому.
Второй подход - оставить это менеджеру памяти Delphi, но брать и отдавать память большими кусками.



 
LEXA   (2003-01-27 15:01) [5]

А размеры страницы какие? неужели 16мег мало для страницы?
У меня проблема в том, что количевтсо элеменов будет меняться (увеличиваться или уменьшаться), во время работы проги постоянно.
В димамичесвом массиве при добавлении элемента Надо будет уставливать ему заново длину, и возможно копировать в него элементы из старого массива.


 
Alexander1966   (2003-01-27 17:13) [6]

Попробуй на C++Buildere, там есть STL библиотека:
(вектора, списки и еще много чего полезного)



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

Форум: "Основная";
Текущий архив: 2003.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.017 c
14-15882
Chainik
2003-01-18 17:36
2003.02.06
Выдает


14-15885
Nest
2003-01-19 14:46
2003.02.06
FLASHBACK = Приветствую ВСЕХ!


1-15587
Zloy
2003-01-29 01:19
2003.02.06
для запуска проги использую следующую конструкцию:


1-15564
Anbezr
2003-01-28 16:25
2003.02.06
Переопределение констант


3-15438
samson
2003-01-20 08:38
2003.02.06
отчёт: графики и диаграммы





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