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

Вниз

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

 
MacroDenS ©   (2004-07-15 16:44) [40]

А на мой взгляд,
автор при объявлении:

type
TMyMassiv = record
v1: String;
v2: String;
v3: Integer;
end;{record}

использует переменные типа стринг неопределенной длины!
а такая строка может занимать и до 2Гбт.
Если у тебя строки не очень длинные ( в пределах 255 символов), то лучше задай так:

TMyMassiv = record
v1: String[255];
v2: String[255];
v3: Integer[255];
end;{record}

и тогда ты с точностью до байта сможешь узнать размер одного элемента массива и проще будет отследить расходы памяти.


 
Суслик   (2004-07-15 16:47) [41]

ага, расходов будет в раз в 5 в среднем больше :)))


 
opoloXAI   (2004-07-16 11:41) [42]

Добрый день. Я ркшил сделать так:

type
 TmySearchRec = record
   Size: Integer;
   Name: TFileName;
   Path: String;
 end;
 PmySearchRec = ^TmySearchRec;
 TSameForm = class(TForm)
 ...
 private
   { Private declarations }
   kolFls: Int64;
   GetPamat: Int64;
   ListOfFiles: TList;
   procedure ScanDir(StartDir: string);
   procedure AddFile(Lst: TList; SchRec: TSearchRec; Dir: String);
   procedure KillAllFiles(Lst: TList);
 public
   { Public declarations }
 end;

procedure TSameForm.FormCreate(Sender: TObject);
begin
    ListOfFiles:=Tlist.Create;
end;

procedure TSameForm.FormDestroy(Sender: TObject);
begin
    ListOfFiles.Free;
end;

procedure TSameForm.AddFile(Lst: TList; SchRec: TSearchRec; Dir: String);
   p: PmySearchRec;
begin
    kolFls:=kolFls+1;
    New(P);
    P^.Size:=SchRec.Size;
    P^.Name:=AnsiUpperCase(SchRec.Name);
    P^.Path:=Dir;
    Lst.Add(P);
    GetPamat:=GetPamat+SizeOf(SchRec.Size)
                      +length(SchRec.Name)+18
                      +length(Dir)+18;
end;

procedure TSameForm.KillAllFiles(Lst: TList);
var i: Integer;
begin
    Lst.First;
    For i:=0 to Lst.Count-1 do Dispose(Lst[i]);
    Lst.Clear;
end;

procedure TSameForm.ScanDir(StartDir: string);
var  SearchRec: TSearchRec;
begin
    If StartDir[Length(StartDir)]<>"\" then StartDir:=StartDir+"\";
    If FindFirst(StartDir+"*.*",faAnyFile,SearchRec)=0 then begin
repeat If (SearchRec.Attr and faDirectory)<>faDirectory then AddFile(ListOfFiles,SearchRec,StartDir)
                                                               else If (SearchRec.Name<>"..")and(SearchRec.Name<>".") then ScanDir(StartDir+SearchRec.Name+"\");
until FindNext(SearchRec)<>0;
FindClose(SearchRec);
    end;
    StBar.Panels[2].Text:=" "+StartDir;
    StBar.Panels[1].Text:=" Найдено : "+IntToStr(kolFls)+" файла(ов)";
    StBar.Panels[0].Text:=" Память: "+myFileSize(GetPamat);
    Application.ProcessMessages;
end;

procedure TSameForm.ItemFindClick(Sender: TObject);
var i: Integer;
   p: PmySearchRec;
begin
    kolFls:=0;
    GetPamat:=0;
    try ScanDir(DirectoryLB.Directory);
    except Beep;
           MessageDLG("Ошибка обращения к диску !",mtWarning,[mbYes],0);
    end;
    StBar.Panels[2].Text:=" Анализ данных ...";
    ProgressBar.MinValue:=0;
    ProgressBar.MaxValue:=ListOfFiles.Count-1;
    ProgressBar.Progress:=0;
    Application.ProcessMessages;
    For i:=0 to ListOfFiles.Count-1 do begin
        p:=ListOfFiles.Items[i];
        {p^.Size}
        {p^.Name}
        {p^.Path}
        ProgressBar.Progress:=i;
        Application.ProcessMessages;
    end;
    KillAllFiles(ListOfFiles);
    ProgressBar.Progress:=0;
end;

Теперь все работает отлично. Память совсем (ну почти совсем) не потребляется. Относительно первого варианта - это "небо и земля".


 
opoloXAI   (2004-07-16 11:44) [43]

Мне только интересно, я с Dispose(Lst[i]) сделал все правилно?


 
Суслик ©   (2004-07-16 11:55) [44]


> opoloXAI   (16.07.04 11:44) [43]
> Мне только интересно, я с Dispose(Lst[i]) сделал все правилно?

Сейчас на меня будут кричать (застарелый спор), но вы сделали не верно.

Т.к. запись TmySearchRec содержит одно поле с управляемым временем жизни, т.е. типа string, то для того, чтобы был все корректно нужно, чтобы не только очисталась память из под записи, но и из под строки.
В вашем случае будет чиститься только из под записи.
надо делать так
var
 p: pmySearchRec
begin
  for ......
  begin
     p := list[i];
     dispose(p);
  end;
end;

Моя правота легко проверяется: достаточно посмотреть cpu - в вашем случае будет просто вызов freemem, в моем dispose.


 
Суслик ©   (2004-07-16 11:56) [45]


> Суслик ©   (16.07.04 11:55) [44]

чтобы понять неверность вашего подхода сделайте в конце showmessage(inttostr(allocmemsize)). При многократном выполнении операции вы увидите, что будет выводиться постоянно увеличивющееся значение.


 
Pavelkq   (2004-07-16 12:54) [46]

А сколько символов может содержать переменная стринг неопределенной длинны?


 
Суслик ©   (2004-07-16 13:03) [47]


> Pavelkq   (16.07.04 12:54) [46]

2гб если не ошибаюсь


 
Pavelkq   (2004-07-16 13:17) [48]

В Гб, не ошибаешься, а сколько это конкретно символов? 1байт = 1символ?


 
Суслик ©   (2004-07-16 13:25) [49]


> 1байт = 1символ?

смотря какая строка - ansisting или widestring


 
Pavelkq   (2004-07-16 13:54) [50]

Я про конкретный пример Path: String; Не знаю какой тут конкретно.


 
Суслик ©   (2004-07-16 14:05) [51]


> Не знаю какой тут конкретно.

здесь 1 б = 1с + накладные расходы.



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

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

Наверх




Память: 0.55 MB
Время: 0.042 c
14-1089739296
elected
2004-07-13 21:21
2004.08.01
Распознавание Лиц


1-1090232022
Murad
2004-07-19 14:13
2004.08.01
ActionList


6-1086073893
Stop
2004-06-01 11:11
2004.08.01
idTCPServer, idTCPClient


1-1090104009
Hunter2
2004-07-18 02:40
2004.08.01
Файл построчно


3-1088855543
Koala
2004-07-03 15:52
2004.08.01
Копирование данных из временной таблицы





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