Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
[ÇÖZÜLDÜ] Programın Ram üzerinde kapladığı alan hk.
#1
Sn. Meslektaşlarım,

Bir konuda yardımlarınızı rica edeceğim.
Exe olarak yazdığım programın boyutu 24 Mb. Programı, windows 10 enterprise 64 bit üzerinde çalıştırdığımda, ram üzerinde % 30 luk bir alan kaplayarak, 340 mb. boyutunda açılıyor. Programın yaptığı işleme gelince, ethernet üzerinden bir cihazdan (PLC) veri alım işlemi yapmak için bir timer çalışıyor. Bu timer her 60 saniyede, cihaza (PLC) connectiion sağlıyor, cihazdaki (PLC) verileri 5 saniye gibi bir sürede alıyor ve connectionu kapatıyor. Sonra bu verileri MYSQL içerisine kayıt ediyor. Cihazdan  400 farklı veri alınıyor. (Sıcaklık, basınç, nem vb.)
Çözemediğim konu, neden daha ilk açılışında programın boyutu 340 Mb. Sadece timer 1000 ms saniyede bir kontrol çalıştırıyor. Bu boyut çok anormal değil mi? Konu ile ilgili fikirlerinizi paylaşmanızı rica eder, hepinize iyi çalışmalar dilerim.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#2
ilk aklıma gelen
değişkenlerin global yada local olması ayrıca
ihtiyacından fazla büyük veri tipleri tutman
işlemi biten bir nesneyi free etmemen vb....
bunların hepsi ramda fazladan yer demektir.

örneklersek
mesala 0 - 1 için integer gibi yada char için string gibi
yada sadece bir sınıf için geçerli olacak değişkenleri global tutman gibi
daha bir çok şey sıralanabilir ram için
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#3
Kod paylaşmadığın için muhtemel olasılıklar sıralanır. Kod paylaşırsanız daha fazla yardım alabilirsiniz.

@adelphiforumz nin bahsettiği konuları araştırın.

Birde Debug ile ilk açılışta adım adım gidin bir yandan da görev yöneticisini açın bellek ne zaman şişiyor bunu kontrol edin. Bu şekilde istediğiniz hedefe ulaşırsınız.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#4
@wiseman, muhtemelen PLCden alacağınız veriler için hafıza statik alan tahsis ediyorsunuz. Dinamik alan kullanıp, işiniz bittikçe bu alanları serbest bırakabilirsiniz.
There's no place like 127.0.0.1
WWW
Cevapla
#5
Cevap veren arkadaşlarıma çok teşekkür ederim. Öncelikle, veritabanına yazma işlemi, ilk etapta başlamadığından dolayı, alanların büyük olmasının çok önemi olmadığını düşünüyorum. İkinci olarak, program içerisinde herhangi bir değişken tanımlı değil. veriler döngü ile anlık olarak okunup, bir memo alana kaydedilip connection kapatılıyor. Sonrası da mysql insert başlıyor. Koda gelince sadece aşağıdaki gibidir.


procedure Tfrmmain.plcoku(Sender: TObject);
var
 Data: Array of Variant;
 Index: Integer;
 Count: Integer;
 Display: String;
begin
 SetLength(Data, DataCount);
 Count:=0;
 While Count < DataCount do
 begin
   Index:=(Count * DataSize) + DataOffset;
   Case DataType of
     0: Data[Count]:=oku_Dave.GetFloat(Index);
   end;
   Inc(Count);
 end;
 Index:=0;
 While Index < DataCount do
 begin
   Display:='' + Format('%10s', [VarToStr(Data[Index])]);
   memo1.Lines.Add(trimleft(display));
   Inc(Index);
 end;
 plc_connect.Active := false;
end;
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#6
Sevgili Meslektaşlarım,

sorunu çözmek için en son yol olarak, bellek temizleme çözümüne gittim ve aşağıdaki fonksiyonla sorunumu çözdüm. Bu tip sorunlarla karşılaşan arkadaşlarım olursa diye, fonksiyonu paylaşıyorum. 340 Mb lik dosyayı 2.3 Mb ye düşürüyor.

procedure TrimAppMemorySize;
var
 MainHandle : THandle;
begin
 try
   MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
   SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
   CloseHandle(MainHandle) ;
 except
 end;
 Application.ProcessMessages;
end;
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#7
SetProcessWorkingSetSize fonksiyonu ile belleği temizlememiş olabilirsin. Bunun yerine sanal bellek ayarlarını kısıtlayıp optimizasyon performansını düşürmüş olman ihtimali yüksek.

Zaten senin sorun bellek taşmasına değil, optimizasyon amaçlı sanal bellek sayfa kullanımına benziyor. Bu da bir sorun değildir, zira lazım olduğunda o boşluğu sistem geri alacaktır.
Cevapla
#8
(23-01-2019, Saat: 18:59)ssahinoglu Adlı Kullanıcıdan Alıntı: SetProcessWorkingSetSize fonksiyonu ile belleği temizlememiş olabilirsin. Bunun yerine sanal bellek ayarlarını kısıtlayıp optimizasyon performansını düşürmüş olman ihtimali yüksek.

Zaten senin sorun bellek taşmasına değil, optimizasyon amaçlı sanal bellek sayfa kullanımına benziyor. Bu da bir sorun değildir, zira lazım olduğunda o boşluğu sistem geri alacaktır.
Selamlar

Sorunu 1 gün bıyunca takip ettim. Fonksiyondan sonra sorun yaşamadım. Zaten windows 10 Enterprise sürümünde bu problem ortaya çıktı. Aynı program windows 10 Pro da problem yaşatmıyor. Program 2 gün çalışma sonucunda bellek taşmasına neden oluyordu. Daha önce yazmayı atladığım bir konuydu bu. Program 1 sene boyunca asla kapanmıyor. Sadece bakım yapılacağı zaman kapatılmak zorunda. Bu nedenle de out of memory hatasını verdiği anda bu problemi görüm ve araştırma yoluna gittim.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#9
(23-01-2019, Saat: 17:27)wiseman Adlı Kullanıcıdan Alıntı: Sevgili Meslektaşlarım,

sorunu çözmek için en son yol olarak, bellek temizleme çözümüne gittim ve aşağıdaki fonksiyonla sorunumu çözdüm. Bu tip sorunlarla karşılaşan arkadaşlarım olursa diye, fonksiyonu paylaşıyorum. 340 Mb lik dosyayı 2.3 Mb ye düşürüyor.

procedure TrimAppMemorySize;
var
 MainHandle : THandle;
begin
 try
   MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
   SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
   CloseHandle(MainHandle) ;
 except
 end;
 Application.ProcessMessages;
end;

S.a Hocam Fonksiyonu Ne Zaman Çalıştıracağız
Cevapla
#10
Bellek kullanımı sürekli artıyorsa hatayı bulup düzeltmek daha doğru olsa gerek.

Bazen bir yerlerde FREE'si eksik CREATE'ler unutulabiliyor.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Projede aynı anda 2 farklı soap servisi kullanımı (Çözüldü) tuna 2 185 19-04-2021, Saat: 19:30
Son Yorum: tuna
  MDI Form : Çözüldü Bay_Y 5 222 15-04-2021, Saat: 20:01
Son Yorum: ahmet6513
  Run Time paneller oluşturmak ve drag-drop ile panelin kordinatlarını bulmak?(ÇÖZÜLDÜ) Hsavci 8 395 08-04-2021, Saat: 01:01
Son Yorum: Hsavci
  IdHttp Dönen veri status Problemi [Çözüldü ] Mesut 26 1.159 30-03-2021, Saat: 15:45
Son Yorum: Mesut
  windows üzerinde çalışan programları gruplamak yanniosman 2 273 17-03-2021, Saat: 18:39
Son Yorum: yanniosman



Konuyu Okuyanlar: 1 Ziyaretçi