Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
ВнизРезкое увеличение размера динамического массива Найти похожие ветки
← →
Германн © (2007-10-12 00:56) [40]Блин. Даже я ошибся. :-(
Вот цитата из первоисточника:
Горбушка, презиравший рассуждения о высоких материях, был больше поэтом и назвал свой журнал исключительно поэтично:
ЗОРИ
Однако Горбушка при всех своих поэтических талантах был безграмотен и уже с первого номера скандально опростоволосился.
На первой странице Горбушкиного издания по случаю бывшего месяца три назад спектакля красовался рисунок из пушкинского "Бориса Годунова".
Рисунок Горбушки изображал Японца в роли Годунова, с большим жезлом в руке.
Но не рисунок заставил всю школу покатываться со смеху, а пояснительная надпись под ним: Юлыстрация к трогедие "Борис Гадунв".
Горбушка умудрился в пяти словах сделать семь ошибок и здорово поплатился.
Поэтичные "Зори" читали все и не потому, что шкидцев очень уж интересовала поэзия, их читали как .хороший юмористический журнал, и даже Янкель обижался:
- Сволочь этот Горбушка... Конкурент.
← →
vint45 (2007-10-12 15:47) [41]Насколько я понял из постов
> Galinka © 11.10.07 22:26) [24] и
> Anatoly Podgoretsky © (11.10.07 22:28) [25]
лавинообразное увеличение памяти связано с особенностью работы менеджера памяти D6. Бороться с этим можно:
1. > vpbar © (11.10.07 20:08) [22]
Заменой динамических массивов на использование TList (минус этого, имхо работать с динамическими массивами легче, но это чисто субъективно)
2. > Sapersky (11.10.07 19:59) [19]
Использованием альтернативного модуля для работы с массивами (ничего сказать не могу, т.к. не работал с модулем)
3. Есть третий вариант. Замена AnsiString на PChar, т.е. в массив будут помещаться строки PChar. Менеджер памяти в этом случае ведет себя корректно, по крайней мере менеджер задач показывает выделение памяти для процесса в пределах 3Мб. Правда не факт, что в других случаях, менеджер будет вести себя столь же корректно, потому как мне не понятны отличия при выделении памяти AnsiString и PChar (хотя PChar "родной" тип винды и для работы с ним вроде как используются системные функции, а следовательно системный менеджер памяти).
зы: в подтвержние об освождении фрагментированной памяти я провел такой эксперимент со строками AnsiString. Задал для сканирования довольно большой каталог с условием, чтобы выделялось достаточно большой объем памяти, но программа при этом не вылетала с ошибкой "Out of memory". После сканирования диспетчер задач показывал объем выделенной памяти около 100Мб, а после наступления определенного события (у меня например после минимизации окна приложения), диспетчер показал 1Мб :)
← →
Sapersky (2007-10-12 16:11) [42]Использованием альтернативного модуля для работы с массивами (ничего сказать не могу, т.к. не работал с модулем)
Он скорее дополняющий, чем альтернативный. Реализует алгоритм подобный тому, что используется в TList, для обычных дин. массивов (Length(array) играет роль Capacity, реальная длина хранится в отдельной переменной).
Используется примерно так:
Type
PFile = ^TFile;
TFileArr = array of TFile;
...
arrFiles: array of TFile;
FileCnt : Integer = 0;
...
With PFile( Arr_AddItem(arrFiles, TypeInfo(TFileArr), FileCnt) )^ do begin
Folder:=InitPath;
FullName:=Path+sr.Name;
Size:=sr.Size;
end;
Метод перевыделения памяти "в 2 раза больше, чем было" (см. Arr_Grow) может показаться чрезмерно экстремальным, но на практике он показывает себя лучше, чем "экономное" приращение на 1 элемент (в вашем примере - 5 мб по диспетчеру задач). Хотя не буду утверждать, что это идеальное решение для всех случаев.
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.11.04;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.033 c