Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.03.2012, 12:04   #1
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию Что забирает память?

Всем привет.

Вот код. Приложение в цикле качает страничку и парсит из нее нужные данные. После первого прохождения цикла приложение берет около 170Мб оперативки. С каждым следующим прохождением забирает еще по 10-50Мб. Подскажите, что именно берет память?

Код:
...
Procedure thr.Delay(Ms: Longint);
Var
  TheTime: LongInt;
Begin
  TheTime:=GetTickCount + Ms;
While GetTickCount < TheTime Do
  sleep(1);
End;
...

procedure thr.Execute;
var
  i,j,r,k,da,zz:integer;
  RegExp: TRegExpr;
  filelist, templist, list: tstringlist;
  http : THTTPSend;
  F: TextFile;
begin
synchronize(load);

count:=0;
zz:=0;
while zz<100 do begin
inc(count);

  http := THTTPSend.Create;
  http.Protocol := '1.1';
  http.Clear;
  http.HTTPMethod('GET', 'http://someurl.com');
    templist:=tstringlist.Create;
    templist.Text := ReadStrFromStream(http.Document, http.Document.Size);
  http.Free;

    for i:=0 to queries.Count-1 do begin
    RegExp := TRegExpr.Create;
    RegExp.Expression := '"(.*?)"';
    row:=i+1;
      znach:=0;
      for j:=templist.Count-1 downto 0 do begin
        if pos(queries[i],templist[j])<>0 then begin
          if RegExp.Exec(templist[j]) then begin
            AssignFile(F, ExtractFilePath(Application.ExeName)+queries[i]+'.txt');
            if FileExists(ExtractFilePath(Application.ExeName)+queries[i]+'.txt') then
              Append(F)
            else
              Rewrite(F);
            WriteLn(F, regexp.Match[1]);
            inc(znach);
            CloseFile(F);
          end;
          templist.Delete(j);
        end;
      end;
      synchronize(upload);
    regexp.Free;
    end;
  synchronize(upload1);
  templist.Free;

  delay(msec);
  inc(zz);
end;
И еще нубский вопрос про TStringList: если я уже сделал List.Free, а потом мне нужно еще раз воспользоваться списком, то мне его нужно повторно создавать List:=TStringList.Create или создать можно один раз, а потом сколько угодно раз делать List.Free, очищаяя его? Или для очистки лучше использовать List.Clear?
trafbite вне форума Ответить с цитированием
Старый 03.03.2012, 12:17   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не вижу секций Try finally...
Человек_Борща вне форума Ответить с цитированием
Старый 03.03.2012, 12:19   #3
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Ок, немного поправил код:
Код:
         try
            if FileExists(ExtractFilePath(Application.ExeName)+queries[i]+'.txt') then
              Append(F)
            else
              Rewrite(F);
            WriteLn(F, regexp.Match[1]);
            inc(znach);
            CloseFile(F);
         finally
         end;
trafbite вне форума Ответить с цитированием
Старый 03.03.2012, 12:34   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

CloseFile надо в Finally закрывать, ровно как и освобождение любых объектов/ресурсов.
Код:
var
 Obj:Tobject;
begin
 Obj:=TObject:=Create;
 try
    {Work with Obj}
  finally
    FreeAndNil(Obj);
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 03.03.2012, 13:02   #5
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Код:
while zz<100 do begin
inc(count);

  http := THTTPSend.Create;
  http.Protocol := '1.1';
  http.Clear;
  templist:=tstringlist.Create;

  try
    http.HTTPMethod('GET', 'http://someurl.com');
    templist.Text := ReadStrFromStream(http.Document, http.Document.Size);
  finally
    http.Free;
  end;

  RegExp := TRegExpr.Create;
  RegExp.Expression := '"(.*?)"';
  try

    for i:=0 to queries.Count-1 do begin
    row:=i+1;
      znach:=0;
      for j:=templist.Count-1 downto 0 do begin
        if pos(queries[i],templist[j])<>0 then begin
          if RegExp.Exec(templist[j]) then begin
            try
              AssignFile(F, ExtractFilePath(Application.ExeName)+queries[i]+'.txt');
              if FileExists(ExtractFilePath(Application.ExeName)+queries[i]+'.txt') then
                Append(F)
              else
                Rewrite(F);
              WriteLn(F, regexp.Match[1]);
              inc(znach);
            finally
              CloseFile(F);
            end;
          end;
          templist.Delete(j);
        end;
      end;
      synchronize(upload);
    end;

    synchronize(upload1);

  finally
    regexp.Free;
    templist.Free;
  end;



  delay(msec);
  inc(zz);
end;
Ок, спасибо за подсказку
Но все равно после каждого прохода цикла программа забирает еще кусок памяти (т.е. ничего не изменилось). Кто подскажет что берет?
trafbite вне форума Ответить с цитированием
Старый 03.03.2012, 13:26   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Тупо:
ставим бряк и смотрим после какой команды уеличивается память.
Человек_Борща вне форума Ответить с цитированием
Старый 03.03.2012, 13:34   #7
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Да нет, тут не так.
Тут после первого прохода память на приложение 170Мб. Потом, во время загрузки страницы в память и в templist, на приложение память уже примерно 250Мб. А вот потом после высвобождения и закрывания память уже в исходные 170Мб не выходит, а получается 178Мб примерно. После третьего прохода 185Мб, ну и т.д.
trafbite вне форума Ответить с цитированием
Старый 03.03.2012, 13:37   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

это нормально.
если оно стабильно не растет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.03.2012, 13:54   #9
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Дак ведь растет Ну в том смысле, что после каждого прохода память, выделенная на приложение увеличивается. Т.е. к примеру после 10 проходов смотрю диспетчером: 240Мб, через 20 проходов 320Мб.
trafbite вне форума Ответить с цитированием
Старый 03.03.2012, 14:24   #10
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Хотя нет, подождал побольше проходов - память то забирается, то высвобождается. Закономерности не заметил, решил забить
trafbite вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что такое последовательная, связная и непрерывная память?? cherry097 Паскаль, Turbo Pascal, PascalABC.NET 1 22.08.2011 13:11
что почитать о создании интерпритатора(как компилятора в память) Пепел Феникса Общие вопросы по программированию, компьютерный форум 5 30.11.2009 19:07
Память, (что тяжелее:функция или процедура) WF7 Паскаль, Turbo Pascal, PascalABC.NET 4 08.06.2009 08:09
Плохая память или что? Rembo Свободное общение 13 06.10.2008 19:10