Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
ВнизTThread и Physical Memory Найти похожие ветки
← →
Дмитрий Иванов (2002-05-05 20:14) [0]Здравствуй всезнающий Ол! Помоги мне найти ответ на мой вопрос - почему уменьшается Physical Memory при использовании TThread? И вообще это опасно?
Пример кода:
unit Search;
interface
uses
Classes, MainUnit;
type
TSearch = class(TThread)
private
FFirma:FTFirma;// FTFirma - указатель на файл типа TFirma
Keys:PFirmKeys;//PFirmKeys=^FirmKeys, где FirmKeys=array of integer
Mas:PMTFirma;//PMTFirma=^MTFirma, где MTFirma=array of TFirma
protected
procedure Execute; override;
public
constructor Create(_FFirma:FTFirma; _Keys:PFirmKeys; _Mas:PMTFirma);
end;
implementation
constructor TSearch.Create (_FFirma:FTFirma; _Keys:PFirmKeys; _Mas:PMTFirma);
begin
FFirma:=_FFirma;Keys:=_Keys;Mas:=_Mas;
inherited Create(false);
end;
procedure TSearch.Execute;
var i:integer;BufFirma:TFirma;
begin
for i:=0 to High(Keys) do
begin
Seek(FFirma^,Keys^[i]-1);
Read(FFirma^,BufFirma);
Mas^[i]:=BufFirma;
end;
end;
end.
===================================
где-то в главном модуле в обработчике onclick какой-то клавиши
...
SetLength(mas,High(Keys));
Poisk:=TSearch.Create(@FPS,@Keys,@Mas);
Poisk.FreeOnTerminate:=true;
Poisk.Priority:=tplower;
...
Программа в фоновом режиме забивает массив Mas, при этом данные считываются из файла FFirma при помощи массива ключей Keys, в котором записаны номера записей которые надо считать.
Нажимая на эту клавишу, замечаю (глядя на тесты), что Pysical Memory быстренько уменьшается и после N-го нажатия ~0kB. Может я что-то делаю не так? Или может это вообще не страшно и не стоит по этому поводу волноваться?
Ответь мне Ол...
← →
~Sergius (2002-05-05 20:35) [1]Я так понимаю уменьшается ДОСТУПНАЯ физ. память, а не ПАМЯТЬ физическая? То есть куски от чипа не отваливаются? 8-0
← →
Дмитрий Иванов (2002-05-05 22:09) [2]Ну да...
А это хорошо или плохо?
← →
Anatoly Podgoretsky (2002-05-05 22:16) [3]То что уменьшается это плохо, а то что не отваливается хорошо
← →
Дмитрий Иванов (2002-05-05 22:25) [4]:)
Ну а как тогда сделать, чтобы не уменьшалась?
← →
~Sergius (2002-05-05 22:58) [5]Ничего в память не записывать.
Доказано, что в смысле экономии памяти, наилучшей стратегией будет отказаться от загрузки данных и инструкций в оперативную память. Есть два варианта - использовать флеш-память или же напрямую выполнять программы на винчестере.
Источники:
1. Gerbert S. & Wanson F. Effective use of Windows memory, pg. 230-250.
2. Hobbit-Bobbit. The Art of computer programming.
← →
~Sergius (2002-05-05 23:01) [6]Вообще, замечана закономерность: чем больше записивается в память, тем меньше в ней остается места. Вот так.
(ну, щас точно в "Потрепаться" улетим:)
← →
Дмитрий Иванов (2002-05-05 23:44) [7]~Sergius (05.05.02 23:01)
Вообще, замечана закономерность: чем больше записивается в память, тем меньше в ней остается места. Вот так.
:)
Кстати, перед SetLength(mas,High(Keys)) я делаю Mas:=nil и по идее память, которая выделилась при последнем нажатии клавиши, должна освободиться, и размер доступной физической памяти должен увеличиться, так? Или ничего подобного?
А что значит "напрямую выполнять программы на винчестере"?
← →
SoftOne (2002-05-06 02:33) [8]> я делаю Mas:=nil и по идее память, которая выделилась при
> последнем нажатии клавиши, должна освободиться
А с чего бы это вдруг?
После этого Вы просто теряете указатель на область памяти, где были записаны данные. Но она, по-прежнему, занята Вами!
← →
Lord Warlock (2002-05-06 09:16) [9]В OnExecute есть строчка Mas^[i]:=BufFirma;
А куда этот мас потом уходит? его кто-нить уничтожает?
Из приведенного кода этого не видно
← →
Дмитрий Иванов (2002-05-06 16:38) [10]SoftOne ©
А с чего бы это вдруг?
После этого Вы просто теряете указатель на область памяти, где были записаны данные. Но она, по-прежнему, занята Вами!
В книжках написано - чтобы освободить память выделенную при помощи SetLength(Mas,Count) достаточно написать Mas:=Nil и память освободиться...получается это не так8-0. Помогите тогда, как правильно освободить эту память?
← →
Fay (2002-05-07 07:57) [11]A SetLength(Mas, 0) не прокатит?
← →
Lord Warlock (2002-05-07 09:08) [12]Fay © (07.05.02 07:57) прав, именно SetLength(Mas, 0) освобождает память, занимаемую массивом, а книжки внимательнее надо читать nil убивает указатель на облать памяти, а не данные, на которые этот указатель указывает (тавтология :)
← →
Виктор Щербаков (2002-05-07 09:13) [13]
> а книжки внимательнее надо читать nil убивает указатель
> на облать памяти, а не данные, на которые этот указатель
> указывает
Присваивание nil переменной, имеющий тип динамического массива действительно освобождает память :)
Не верите? Посмотрите сгенерированный код.
Хотя нет оснований не верить хэлпу. В нем написано:
To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize; either of these methods disposes of the array, provided there are no other references to it.
← →
Cobalt (2002-05-07 09:17) [14]>достаточно написать Mas:=Nil
Это для простых динамических массивов. А у вас ведь (насколько я понял) - динамический массив указателей, поэтому надо проходить по всему массиву и каждому элементу присваивать Nil (или - чем вы там выделяли? FreeMem? )
← →
Дмитрий Иванов (2002-05-10 18:39) [15]
> Виктор Щербаков © (07.05.02 09:13)
> Присваивание nil переменной, имеющий тип динамического массива > действительно освобождает память :)
> Не верите? Посмотрите сгенерированный код.
Вот и я про тоже...
> Cobalt ©
> Это для простых динамических массивов. А у вас ведь (насколько
> я понял) - динамический массив указателей, поэтому надо
> проходить по всему массиву и каждому элементу присваивать
> Nil (или - чем вы там выделяли? FreeMem? )
Не, массив у меня из обычных записей, поэтому вроде каждому элементу массива nil присваивать не надо.
Память выделял так - SetLength(mas,High(Keys))
> Lord Warlock © (07.05.02 09:08)
> Fay © (07.05.02 07:57) прав, именно SetLength(Mas, 0)
> освобождает память, занимаемую массивом, а книжки внимательнее
> надо читать nil убивает указатель на облать памяти, а не
> данные, на которые этот указатель указывает (тавтология
> :)
Точно;-), внимательнее их надо читать:)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.05.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c