Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
[ÇÖZÜLDÜ] Programın Ram üzerinde kapladığı alan hk.
#11
(24-01-2019, Saat: 13:10)theSinan Adlı Kullanıcıdan Alıntı:
(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

Fonksiyonu dilerseniz programın başlangıcından hemen sonra, ya da büyük bir proses çalıştırdıktan sonra uygulayabilirsiniz.

(24-01-2019, Saat: 13:17)ssahinoglu Adlı Kullanıcıdan Alıntı: 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.

Selamlar

Kodun tamamını paylaştım zaten sizinle. Bu işlem bittikten sonra, memo daki değerler veri tabanına insert ediliyor. Create ya da free olacak bir alan varsa yazdığım kodda, bana düzenleyip yazarsanız memnun olurum.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#12
(22-01-2019, Saat: 12:49)wiseman Adlı Kullanıcıdan Alıntı: 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;

Uygulamanızda Memory Leak var mı öncelikle onu sorayım. ReportMemoryLeaksOnShutDown := true ile çalıştırın ve bir müddet sonra uygulamayı kapatın bir hata alıyor musunuz ? İkinci olarak sürekli artan bir hafıza ile mi karşı karşıyasınız ?

Böyle bir durum var ise kesinlikle hafıza sızıntısı vardır. Kodu ciddi anlamda incelemek gerekir. Örneğin yukarıdaki kod'da ne olur ne olmaz diye Data := nil; atamasını yapmanızı önerebilirim.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#13
@wiseman kodların içerisinde
memo1.Lines.Add(trimleft(display));
şeklinde bir satır var memo1 içeriği ne zaman temizleniyor.
hiç durmadan memo alana bir şeyler mi yazılıyor banamı öyle geldi
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#14
(24-01-2019, Saat: 18:34)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı:
(22-01-2019, Saat: 12:49)wiseman Adlı Kullanıcıdan Alıntı: 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;

Uygulamanızda Memory Leak var mı öncelikle onu sorayım. ReportMemoryLeaksOnShutDown := true ile çalıştırın ve bir müddet sonra uygulamayı kapatın bir hata alıyor musunuz ? İkinci olarak sürekli artan bir hafıza ile mi karşı karşıyasınız ?

Böyle bir durum var ise kesinlikle hafıza sızıntısı vardır. Kodu ciddi anlamda incelemek gerekir. Örneğin yukarıdaki kod'da ne olur ne olmaz diye Data := nil; atamasını yapmanızı önerebilirim.

Tuğrul Hocam,

Program açılır açılmaz timer çalışıyor. Her 5 dakikada bir bu timer devreye girerek kodu çalıştırıyor. Buradaki kodun işlevi bitince, PLC den connection koparılıyor zaten kodda görüldüğü üzere. Akabinde, hemen mysql veritabanına connection sağlanıyor. Memo içerisindeki veriler insert ediliyor. Memo boşaltılıyor. Başka da kod yok programımda. Benim ram boşaltarak çözdüğüm sorunum şu : Windows 10 Enterprise olan PC de, daha exe çalışır çalışmaz 340 Mb olarak açılıyor. Ama derleme boyutu 24 Mb. Windows 10 Pro PC de sadece 30 Gb olarak açılıyor. Aynı exe. Sadece işletim sistemi farklı. 340 Mb de sabit kalıyor. MySQL insert işlemi sırasını da takip ettim. 350 Mb. ye kadar çıkıyor, sonra tekrar 340 Mb. ye iniyor boyut. Sıkıntım bu. Çözüm olarak ta fonksiyonla çözebildim. Hala araştırıyorum, işletim sisteminde fazladan çalışan servisler mi bu bıyuta getiriyor exe yi, yoksa farklı bir sorun mu var? Nil, Free vb. yapabileceğim bir create işlemim yok.

(24-01-2019, Saat: 18:47)adelphiforumz Adlı Kullanıcıdan Alıntı: @wiseman  kodların içerisinde
memo1.Lines.Add(trimleft(display));
şeklinde bir satır var memo1 içeriği ne zaman temizleniyor.
hiç durmadan memo alana bir şeyler mi yazılıyor banamı öyle geldi

Selamlar

Memodan bilgiler döngü ile MYSQL veri tabanına insert edildikten hemen sonra memoyu temizliyorum. Zaten bu bilgilerin insert işlemi en çok 5 saniye sürüyor.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#15
Bir üsadımız araştırma yaparken bu makale denk gelmiş...
Windows 10 da DLL yüklediğinizde, DLL içerisinde ki tüm değişkenler için ram de yer ayrlılıyor... 

Eğer harici DLL kullanımı varsa bu da etkileyebilir...
Girdim İlim Meclisine, 
Eyledim Kıldım Talep, 

Dediler İlim Geride, 
İlla Edep İlla Edep.

Yunus Emre
Cevapla
#16
Merhaba bu konuyla ilgili eklemek istediğim bir durum vardı başka konu açmak istemedim biraz hortlatmak gibi olacak ama;

Yabancı kaynaklardan yaptığım araştırmalarla yola çıkarak şunu söyleyebilirim ki , bazı programlar tstringlist vs içerdiğinde delphi bunları free etseniz bile görev yöneticisinde bu alan programa ait gözüküyor. Bu yüzden görev yöneticisini dikkate almamak lazım leak ararken. Ancak görev yöneticisindeki boyutu düşürmek için bu kod yapısını denesek acaba bir soruna yol açabilir miyiz bunu test edeceğim.
Cevapla
#17
Trim ederseniz hemen boşalır.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


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 396 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