Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
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.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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, Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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;
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
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ı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.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.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla
#9
(23-01-2019, Saat: 17:27)wiseman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.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
  timage üzerinde mouse ile çizim duraumsa 0 57 02-09-2019, Saat: 16:16
Son Yorum: duraumsa
  Çözüldü Fastreport degisken alan yazdırma cinarbil 5 556 25-04-2019, Saat: 16:37
Son Yorum: cinarbil
  Token için Alan Boyutu Fesih ARSLAN 9 655 08-03-2019, Saat: 12:08
Son Yorum: yhackup
  Tablodaki alan isimlerini listelemek baloglurecep 4 416 10-01-2019, Saat: 09:19
Son Yorum: elixir84
  Text alan tanımlaması hk. cmenevse 11 1.195 24-10-2018, Saat: 10:27
Son Yorum: yhackup



Konuyu Okuyanlar: 1 Ziyaretçi