S.A.
Kolay gelsin arkadaşlar. Mevlüt kandiliniz mübarek ve hayırlara vesile olsun inşallah.
benim bir sorum olacak. üzerinde çalıştığım program günün 24 saati hatta belkide kişi kapatıp yeniden açıncaya kadar çalışacak ve bu program bir tarama işlemi yapıyor yani anlayacağını sürekli aktif olacak.
görev yöneticisinden baktım ve bir şey dikkatimi çekti. program belirli aralıklar ile tarama yapıyor. tarama bitiyor ve zamanı gelince tekrar tarama yapıyor 10 sn de bir taradığını düşünün ve program bu işlemi her gerçekleştirdiğinde görev yöneticisindeki program memory kullanımı artıyor örneğin 11.325 K kullanıyor o an tekrar tarama yapınca 11.450 k oluyor ve bu her tarama sonucunda artıyor. illaki bir süre sonra hata verecek sistem kaynakları dolayısı ile. bunu nasıl çözümlerim
mesela her tarama sonrası programımın memory kullanımı nasıl ilk açıldığındaki düzeye getirebilirim.
Teşşekür ederim.
program ve hafıza(Ram)
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
program ve hafıza(Ram)
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim:
Re: program ve hafıza(Ram)
programda olusturup yok etmediginiz nesneler memory leak'e sebep oluyor olabilir. her ram artmasini da memory leak'e yormamak lazim tabiki cunku windowsun ram yonetim tarzi biraz karisik olabilir ama gorev yoneticisinde programinizin kullandigi ram miktari surekli artiyor ve anormal seviyelere geliyorsa o zaman kodlarinizi kontrol etmeniz gerekir.
memory leaklere sadece kendi kodunuz degil kullandiginiz 3. parti bilesenler ya da delphinn vcl kutuphanesinde ki bazi bilesenlerde neden olabilir. bu tip memory sizintilarini tespit etmek icin bazi araclar mevcut. onlardan yararlanabilirsiniz.
http://delphi.about.com/od/toppicks/tp/aatpmemleak.htm
bunun yaninda delphi 2007 de kullanabileceginiz ReportMemoryLeaksOnShutdown adli bir degisken mevcuttur. eger bu degiskene true degeri atarsaniz delphi program sonlandiginda size olusan memory leakleri raporlayacaktir lakin verilen raporun cokta kullanisli olmadigini soylemem gerekir. kullanisli oldugu kisim ise indy dahil vcl deki bircok bileseni bu degiskenle test edip memory leak olustugunu gorebilmektir.
http://delphi.about.com/od/adptips2006/ ... y_leak.htm
memory leaklere sadece kendi kodunuz degil kullandiginiz 3. parti bilesenler ya da delphinn vcl kutuphanesinde ki bazi bilesenlerde neden olabilir. bu tip memory sizintilarini tespit etmek icin bazi araclar mevcut. onlardan yararlanabilirsiniz.
http://delphi.about.com/od/toppicks/tp/aatpmemleak.htm
bunun yaninda delphi 2007 de kullanabileceginiz ReportMemoryLeaksOnShutdown adli bir degisken mevcuttur. eger bu degiskene true degeri atarsaniz delphi program sonlandiginda size olusan memory leakleri raporlayacaktir lakin verilen raporun cokta kullanisli olmadigini soylemem gerekir. kullanisli oldugu kisim ise indy dahil vcl deki bircok bileseni bu degiskenle test edip memory leak olustugunu gorebilmektir.
http://delphi.about.com/od/adptips2006/ ... y_leak.htm
Re: program ve hafıza(Ram)
Sadettin Hocam, kısaca programın yaptığı işi izah edeyim. Herşey standart delphi bileşenleri, program timer nesensinde belirtilen aralıklarda bir filelistboxtaki dosyaları kontrol ediyor ve bu doosyaları tek tek alıp veri tabanına yazıyor vt ye her yazmadan sonra dabase için tüm datasetleri kapatıp connected özelliğini false edip sonraki taramada tekrar true ediyorum(sürekli bağlantıda kalması problem yaratmasın diye). sonra tekrar kontrol ediyorum, sonra tekrar hepsi bu başka hiç bir iş yapmıyor. ayrıca veri tabanına yazma işleminide query içinden insert ediyorum.
Formda arkadaşlardan biri uygulamayı minimize ve sonradan restore ettiğinizde memory kullanımı düşer diyordu doğru minimize ettiğimde memory kullanımı uygulamanın ilk açılışından bile küçük değerlere iniyor ancak tekrar restore ettiğimizde minimize etmeden önceki memory kullanım değeri ne ise ilk işlemde hemen eski değere ulaşıyor. yani bu yöntem memory şişmesini birazda olsa geçiktirir belki ama kesin çözül gibi.
Formda arkadaşlardan biri uygulamayı minimize ve sonradan restore ettiğinizde memory kullanımı düşer diyordu doğru minimize ettiğimde memory kullanımı uygulamanın ilk açılışından bile küçük değerlere iniyor ancak tekrar restore ettiğimizde minimize etmeden önceki memory kullanım değeri ne ise ilk işlemde hemen eski değere ulaşıyor. yani bu yöntem memory şişmesini birazda olsa geçiktirir belki ama kesin çözül gibi.
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Re: program ve hafıza(Ram)
serbek_tr memory örneklerin standart bir delphi uygulamasının değerlerini içeriyor...hazır tanımlı unitler(standartlar) zaten program açıldığında 5000 K civarı ram kullanıyor.Yani senin verilerin gayet normal......anormal olması için....100mb ın üstüne çıkması lazım senin uygulaman için 20mb ın üstüne çıkıyorsa bi anormallik söz konusu olabilir ama 10-20 arası normal yani....kafana takma derim....
Re: program ve hafıza(Ram)
s.a.
@serbek_tr; kodlarla yapmak istediğin işlemi anladık ama ne yaptığını göremedik. @Sadettin in dediği gibi problem senin kodlarında olmayabilirde ama onu anlayabilmemizin tek yolu kodları incelemek. Bilmem anlatabildim mi?
kolay gelsin.
@serbek_tr; kodlarla yapmak istediğin işlemi anladık ama ne yaptığını göremedik. @Sadettin in dediği gibi problem senin kodlarında olmayabilirde ama onu anlayabilmemizin tek yolu kodları incelemek. Bilmem anlatabildim mi?
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: program ve hafıza(Ram)
Memnuniyetle arkadaşlar
Global Değişkenler
Bu kod timer kontrolü herşey burada başlar
aşağıda sadece aahaber kontrolü veriyorum foto kontrol procedure de aynı mantıkla çalışıyor
ve bu yolun daha başı buna benzer toplamda 7-8 kontrol daha oalcak yani
bu arada arkadaşlar ufak bir ayarlama yaptım sabaha kadar server üzerinde deneme çalışması yaptım
başka bir timer ilede 10 dk bir minimize ve restore yaptım sonuç olarak sabaha kadar 200.000 adet kayıt girildi
program sabah baktığımda 53.000 kb hafıza kullanımındaydı aslında bununda çözümü var belirtilen zamanda programın kapanması ve tekrar açılması. ayrıca program sabaha kadar toplam 12 access violation hatası vermiş sebebini bilmiyorum
Kod: Tümünü seç
var
AAAgentForm: TAAAgentForm;
AAHaberSayisi, AAFotoSayisi, AutoKontrol,
AAHaberDisari, KontrolZamani,
AAHaberDisDosyaAdiTuru , TopHata : SmallInt;
ReadFile, WriteFile : Integer;
AAHaberTaramaKlasoru, AAFotoTaramaKlasoru,
AAFotoHaberTaramaKlasoru,
AAHaberKayitKlasoru, AAFotoKayitKlasoru,
AAHaberDisDosyaAdi, AAHaberZamanKlasoru : String;
HataVar, YazmaHatasiVar : Boolean;
Kod: Tümünü seç
procedure TAAAgentForm.KontrolTimer(Sender: TObject);
begin
If Length(ErrLog.Text) >0 Then
Begin
AAHaberSayisi := 0;
AAFotoSayisi := 0;
ErrLog.Clear;
TopHata := TopHata+1;
HataP.Caption :='Hata : '+IntToStr(TopHata);
End;
If AAHaberSayisi = 0 Then AAHaberKontrol;
sleep(1500);
If AAFotoSayisi = 0 Then AAFotoKontrol;
end;
aşağıda sadece aahaber kontrolü veriyorum foto kontrol procedure de aynı mantıkla çalışıyor
ve bu yolun daha başı buna benzer toplamda 7-8 kontrol daha oalcak yani
bu arada arkadaşlar ufak bir ayarlama yaptım sabaha kadar server üzerinde deneme çalışması yaptım
başka bir timer ilede 10 dk bir minimize ve restore yaptım sonuç olarak sabaha kadar 200.000 adet kayıt girildi
program sabah baktığımda 53.000 kb hafıza kullanımındaydı aslında bununda çözümü var belirtilen zamanda programın kapanması ve tekrar açılması. ayrıca program sabaha kadar toplam 12 access violation hatası vermiş sebebini bilmiyorum
Kod: Tümünü seç
procedure TAAAgentForm.AAHaberKontrol;
Var
Kanal, Sehir,
AAFileName, HaberZamani,
HaberBasligi, SqlText, Kategori : String;
Bul, Kategori_Id : Integer;
Label Tekrar;
begin
tEKRAR:
YazmaHatasiVar := False;
AAHaberList.Mask := '*.*';
AAHaberList.Mask := '*.txt';
If AAHaberList.Items.Count < 1 Then
Begin
AAHaberSayisi := 0;
If Db.Connected Then
Begin
Db.CloseDataSets;
Db.Connected := False;
End;
If TR.Active Then TR.Active := False;
Exit;
End;
If Not Db.Connected Then Db.Connected := True;
If Not TR.Active Then TR.Active := True;
If Not QAAAgent.Active Then QAAAgent.Active := True;
AAHaberList.ItemIndex :=0
ScanEdit.Lines.LoadFromFile(AAHaberList.FileName);
ReadFile := ReadFile+1;
ReadFileP.Caption := 'Okunan : '+ InttoStr(ReadFile);
AAHaberSayisi := AAHaberSayisi + 1;
Bul := Pos('',ScanEdit.Text);
If Bul <> 0 Then
Begin
ScanEdit.SelStart :=Bul;
ScanEdit.SelLength := 1;
AAFileName := Copy (ScanEdit.Lines.Strings[ScanEdit.Line],Bul+1,Length(ScanEdit.Lines.Strings[ScanEdit.Line])-2);
Kategori := Copy (ScanEdit.Lines.Strings[ScanEdit.Line+1],Length(ScanEdit.Lines.Strings[ScanEdit.Line+1])-4,3);
End
Else
Begin
AAFileName := 'BLNMYR';
End;
QAAKAtegori.Close;
QAAKategori.SQL.Clear;
QAAKategori.SQL.Text := ' SELECT KATEGORIID, KATEGORIKOD, KATEGORIACIKLAMA FROM KATEGORI'+
' WHERE KATEGORIKOD ='+QuotedStr(Trim(Kategori));
QAAKAtegori.OPEN;
If QAAKAtegori.RecordCount <> 0 Then
Kategori_Id := QAAKAtegoriKategoriId.Value
Else Kategori_Id :=0;
Bul := Pos('',ScanEdit.Text);
If Bul <> 0 Then
Begin
ScanEdit.SelStart :=Bul;
ScanEdit.SelLength := 1;
Kanal := Copy (ScanEdit.Lines.Strings[ScanEdit.Line],Length(ScanEdit.Lines.Strings[ScanEdit.Line])-2,3);
End
Else
Begin
Kanal := 'BLNMYR';
End;
Bul := Pos('(A.A)',ScanEdit.Text);
If Bul <> 0 Then
Begin
ScanEdit.SelStart :=Bul;
ScanEdit.SelLength := 1;
Bul := Pos('(A.A)',ScanEdit.Lines.Strings[ScanEdit.Line]);
Sehir := Copy (ScanEdit.Lines.Strings[ScanEdit.Line],0,Bul-1);
End
Else
Sehir := 'BLNMYR';
Bul := Pos('',ScanEdit.Text);
If Bul <> 0 Then
Begin
ScanEdit.SelStart :=Bul;
ScanEdit.SelLength := 1;
HaberZamani := Copy (ScanEdit.Lines.Strings[ScanEdit.Line+1],1,Length(ScanEdit.Lines.Strings[ScanEdit.Line+1]));
End
Else
HaberZamani := DateTimeToStr(NOW);
If Not GecerliTarihmi(HaberZamani) Then HaberZamani := DateTimeToStr(NOW);
Bul := Pos('-',ScanEdit.Text);
If Bul <> 0 Then
Begin
ScanEdit.SelStart :=Bul;
ScanEdit.SelLength := 1;
Bul := Pos('-',ScanEdit.Lines.Strings[ScanEdit.Line]);
HaberBasligi := Copy (ScanEdit.Lines.Strings[ScanEdit.Line],Bul+1,Length(ScanEdit.Lines.Strings[ScanEdit.Line])-Bul);
End
Else
HaberBasligi := 'BLNMYR';
AAHaberInfo.Clear;
AAHaberInfo.Lines.Add('Dosya Adı : '+Trim(AAFileName));
AAHaberInfo.Lines.Add('Kategori : '+QAAKAtegoriKategoriKod.AsString);
AAHaberInfo.Lines.Add('Bölge : '+Trim(UpperCase(Kanal)));
AAHaberInfo.Lines.Add('Şehir : '+Trim(Sehir));
AAHaberInfo.Lines.Add('Kısa Başlık: '+HaberBasligi);
AAHaberInfo.Lines.Add('Tarih-Saat : '+HaberZamani);
Try
QAAAgent.Insert;
Except
On E:Exception do
Begin
YazmaHatasiVar := True;
QAAAgent.Cancel;
TR.RollbackRetaining;
AAHaberInfo.Lines.Add('*****Hatası Oluştu*****');
AAHaberInfo.Lines.Add('Hata :'+E.Message);
AAHaberInfo.Lines.Add('Dosya Adı : '+Trim(AAFileName));
AAHaberInfo.Lines.Add('Kategori : '+QAAKAtegoriKategoriKod.AsString);
AAHaberInfo.Lines.Add('Bölge : '+Trim(UpperCase(Kanal)));
AAHaberInfo.Lines.Add('Şehir : '+Trim(Sehir));
AAHaberInfo.Lines.Add('Kısa Başlık: '+HaberBasligi);
AAHaberInfo.Lines.Add('Tarih-Saat : '+HaberZamani);
AAHaberInfo.Lines.Add('*****Log Tanımlaması Sonu*****');
End;
End;
Procedure_Id.ParamByName('TNAME').AsString :='HABER' ;
Procedure_Id.ExecProc ;
QAAAgentHaberId.AsInteger :=Procedure_Id.ParamByName('OUTID').AsInteger;
QAAAgentHaberZamani.AsString :=HaberZamani;
QAAAgentKanal.Value := Trim(UpperCase(Kanal));
QAAAgentKategori.Value := Kategori_Id;
QAAAgentFileName.Value := Trim(AAFileName);
QAAAgentHaberKaynagi.Value := Trim(Sehir);
QAAAgentBaslik.Value := HaberBasligi;
QAAAgentHaber.Value := ScanEdit.Text;
Try
QAAAgent.Post;
Except
On E:Exception do
Begin
YazmaHatasiVar := True;
QAAAgent.Cancel;
TR.RollbackRetaining;
AAHaberInfo.Lines.Add('***** Hata Oluştu *****');
AAHaberInfo.Lines.Add('Hata :'+E.Message);
AAHaberInfo.Lines.Add('Dosya Adı : '+Trim(AAFileName));
AAHaberInfo.Lines.Add('Kategori : '+QAAKAtegoriKategoriKod.AsString);
AAHaberInfo.Lines.Add('Bölge : '+Trim(UpperCase(Kanal)));
AAHaberInfo.Lines.Add('Şehir : '+Trim(Sehir));
AAHaberInfo.Lines.Add('Kısa Başlık: '+HaberBasligi);
AAHaberInfo.Lines.Add('Tarih-Saat : '+HaberZamani);
AAHaberInfo.Lines.Add('***** Hata Bilgisi Sonu *****');
End;
End;
TR.CommitRetaining;
WriteFile := WriteFile+1;
WriteFileP.Caption := 'VT''''ye Yazılan : '+ InttoStr(WriteFile);
Try
If YazmaHatasiVar Then
Begin
If Not(DirectoryExists('C:\YagaAgent\HataDosya') )Then
CreateDir('C:\YagaAgent\HataDosya');
If Not(DirectoryExists('C:\YagaAgent\HataDosya\AA') )Then
CreateDir('C:\YagaAgent\HataDosya\AA');
If Not(DirectoryExists('C:\YagaAgent\HataDosya\AA\Haber') )Then
CreateDir('C:\YagaAgent\HataDosya\AA\Haber');
CopyFile(PChar(AAHaberList.FileName), PChar('C:\YagaAgent\HataDosya\AA\Haber\'+AAHaberList.FileName), True);
End;
DeleteFile(AAHaberList.FileName);
Except
End;
If AAHaberSayisi > 0 Then
Goto Tekrar;
Else
AAHaberSayisi := 0;
end;
Procedure Forum.Imza(Sender: TObject)
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;
Begin
ShowMessage('Her türlü fikire, Her zaman açığım')
End;