Kaynak Sızıntısı, Programcının Utanç Kaynağı (Memory Leak)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Kaynak Sızıntısı, Programcının Utanç Kaynağı (Memory Leak)

Mesaj gönderen mrmarman »

Selamlar.
- Uzun zamandır kafamı kurcalayan bir soru var. Kendimce çözdüm ama
alternatif bir çözümü vardır diye değerlendiriyorum.

- Bir CD'deki 2000 tane WMF dosyasını bir veritabanına atıyorken, WMF
resmin, Width ve Height değerini almak için küçük bir fonksiyonla TMetafile
create edip, işim bitince de Free ediyordum.

- Bu arada köşede sürekli açık olan Kaynak Ölçer'in seviyesine gözüm ilişti,
hızla azaldığını gördüm. Açınca da ne göreyim. Kısa süre içinde Sistem ve
Kullanıcı kaynakları tükendi. :(

- Acaba Free edince başka işlem mi yapmam gerekiyor ki hafızam boşalsın diye
aşağıdaki işlemi denedim. Bir tane WMF'yi 10.000 kere hafızaya yükleyip free
ettim.

procedure TForm1.Button1Click(Sender: TObject);
Var
M : TMetaFile;
I : Integer;
begin
for I := 0 to 10000 do
begin
M := TMetafile.Create;
M.LoadFromFile('C:\deneme.wmf');
M.Free;
Application.Processmessages;
Button1.Caption := IntToStr(I);
end;
end;

- Sistem kaynaklarında hiç eksilme olmadı Ben de çözüm olarak her WMF
dosyasını sırasıyla, HDD'ye 'Deneme.WMF' olarak sabit bir isim ile kaydedip,
sonra bu kaydedilenden bilgileri eski şekilde sorgulayıp veritabanına
ekledim. Problemim çözüldü :o)

- Ama kafamdaki soru baki kaldı. :(
Resim
Resim ....Resim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Peki sizin programin işgal ettiği memory seviyesine neler oldu bu sirada o da artiyor muyud. Eğer onda artış var ise sorunu kodlarda aramak lazim. Yok eger o degismiyorsa da belki de işletim sistemi kafasına göre bu dosyları cache filan mi yapıyor acaba....
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam.

- Programın işgal ettiği memory seviyesi Yok sayıyorum.

- Çünkü size verdiğim örnekten farklıolarak

Kod: Tümünü seç

M.LoadFromFile('C:\deneme.wmf'); 
satırı yerine CD'deki resimlerin yerlerini gösteren

Kod: Tümünü seç

M.LoadFromFile(Memo1.lines[i]);
satırı yer alıyor. Tabi takdir edersiniz ki sayac bitişi 10.000 değil

Kod: Tümünü seç

Memo1.Lines.Count-1
:)

- Zaten bildirdiğim gibi her dosyayı ayrı ayrı HardDisk'e aynı isim olmak şartıyla kopyalayıp, kopyalanan dosyayı M'ye load edersem hafızada herhangi bir eksilme olmuyor. :)

- Kopyaladığım dosya adı kendi orjinal adı olursa yani, sürekli değişken bir isim olunca hafızadan yiyor. :?

- Bu da en önemli gösterge. :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2357
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Çok fazla arka arkaya ve hızlı bir işlem yapılacaksa. Create edp free lemek pek pratik değil. bununda sebebi bence windows un ram yönetimi. bunun yerine Genel bir yerde ilk form açılırken create edip. içeriğin boşaltıması daha mantıklı ve hatasız çalışıyor
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selamlar.

- Arka arkaya 10.000 kere yükleyip free etmeyi, bunun sebebini araştırmak adına denemek için yaptım.

- Sonuç istediğim gibi olduğundan ben bu tip bir çözümü kullandım.

- Yani tek isim okuyup free edilirse, 10.000 kere de olsa hafizada bir değişiklik olmıuyor.

- Aynı döngü içine dosya adı değişen bir durum sokulduğunda herşey aynı olmasına rağmen 100.'üncü wmf'den sonra şişmeye başlıyor. :) komik ama gerçek bu.

- MemoryStream'e atıp denedim yine şişti. :? Akıllılık edip her dosyayı memorystream'e atıp, oradan LoadFromStream denedim sonuç fiyasko. Aynı durum ... :cry:

- Neyse problemimi çözdüm ama bu bir tür BUG ise sizlerin de bilgisi olsun diye bu başlığı açtım. Paylaşmak istedim. :o
Resim
Resim ....Resim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Unutmadan, bir de zaten söyleminize katılıyorum. +1

- FormCreate olayında Global tanımlanmış bir MetaFile kullanıyorum zaten.

- FormCloseQuery'de de Free ediliyor.

- Bahsi geçen ise Deney amaçlı bir çabaydı.
Resim
Resim ....Resim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

işletim sistemi ne kullanıyor sunuz? resimler gdi kaynaklarını kullanırlar ve bu kaynak Win9x'te son derece sınırlıdır. Eğer Win9x serisi ise normal.

Kolay gelsin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Evet WinME kullanıyorum. Ama asıl sorun neden 2000 tane resim tek isimle yüklenince problem çıkmıyor da 2000 farklı isim olarak yüklenince sorun çıkıyor.
Resim
Resim ....Resim
DotCom
Kıdemli Üye
Mesajlar: 1696
Kayıt: 11 Tem 2003 10:30
Konum: İzmir
İletişim:

Mesaj gönderen DotCom »

Bana kalırsa tamamen bir işletim sistemi algoritması problemi gibi gözüküyor. olay şöyle bence eğer farklı isimlerde dosyaları çağırırsanız CD nizin içindeki tüm dosyaları ram e yükleme ye çalışıyor. fakat aynı isimde çağırdıgınızda bunlara RAM Register da Stack patlaması yapmadan aynen üzerine kaydediyor. Yani ,, aynı ismi veridginizde RAM bu olayı tek dosya gibi ele alıyor.

Bunu şöyle düşün ; 1000 defa ms word ü çalıştır bişi olmaz. fakat 1000 tane birbirinden farklı programı ard arda çalıştır ozaman sistem kaynaklarında emin olki 1000 e erişmeden ciddi bir düşüş olacaktır. saygılar.
Cevapla