Kaynak Sızıntısı, Programcının Utanç Kaynağı (Memory Leak)
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Kaynak Sızıntısı, Programcının Utanç Kaynağı (Memory Leak)
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ü )
- Ama kafamdaki soru baki kaldı.
- 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ü )
- Ama kafamdaki soru baki kaldı.
Selam.
- Programın işgal ettiği memory seviyesi Yok sayıyorum.
- Çünkü size verdiğim örnekten farklıolarak
satırı yerine CD'deki resimlerin yerlerini gösteren
satırı yer alıyor. Tabi takdir edersiniz ki sayac bitişi 10.000 değil
- 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.
- 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');
Kod: Tümünü seç
M.LoadFromFile(Memo1.lines[i]);
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.
Ç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
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 !!!
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5
Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
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 ...
- 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.
- 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 ...
- 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.
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.
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.