Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
FMX Ram Kullanım problemi
#1
Merhaba.
C++ builder windows için uygulama geliştiriyorum.
bir kaç gün önce fmx liste sorunları için konu açmiştim. https://www.delphican.com/showthread.php?tid=4853
@mrmarman teşekkür ederim yardımcı oldu.

yanlız fark ettim. VCL kullandığım zaman aynı kodlar ile 200 tane checbox oluşturuyorum max 5mb kadar ram yiyor.
ama FMX eklediğim zaman 50mb+ yiyor ve bu değer sil ekle yaptıkca artıyor. 15mb kullanırken birden 50mb gibi seviyelere cıkıyor.
temalı temasız denedim VCL göre yinede çok fazla ram yiyor. denemek için 200 tane ekledim. daha cok fazla component ekleyince daha artacaktır.

acaba ben mi bir şeyi yanlış yapıyorum sizde durum böylemi.
teşekkür ederim.
--

Konuyu tekrar güncelleyeceğim, verdiğim rahatsızlıktan dolayı özür dilerim.
Gecen günlerde sadece componentler daha zengin olmasından dolayı fmx gecis yapmak istedim.
daha sonra başlangıçta vcl göre daha fazla ram tükettiğini fark ettim. miktar 20mb falan olunca umursamadım. 
Ama en ufak bir şey yaptığımda ram kullanımı inanılmaz derecede yükseliyor. Bende vcl devam etmek zorunda kaldım.

şimdi ise fmx kullanmak zorunda olduğumu fark ettim. çok uğraştım ama vcl artık karşılayamıyor.
geçmişe dönük XE 2010 2007 versiyonları indirip denedim ama vcl kullanamam bende tekrar 10.4.1 ile denemeler yaptım ama malesef çok aşırı ram tüketiyor.

denemek için yaptığım şey. iki memo ekledim ve bunları yazdım. Ram kullanımı 50 mb dayandı. (C++ Builder) Delphide durum nedir bilmiyorum
for (int i = 0; i < 10000; i++) {
Memo1->Lines->Add(i);
Memo2->Lines->Add(i);
}

bundan sonra ramrush programı çalıştırdım ram kullanımı 0,3 gibi değerlere düştü.
Halen sanki bir şey var ama ben bilmiyorum gibi geliyor bana.
sizde durum böyle mi acaba ram kullanımı sizin projelerde böyle yüksek mi. bunu rağmen nasıl kullanıyorsunuz gerçekten çok merak ediyorum.
artık ya bu sorunu çözmek zorumdayım yada rad studio değiştirmek zorundayım. pişmanım ram studio ile bunca zaman devam ettiğimdem dolayı. hep zorlama devam ettim hatalarını eksiklerini rağmen ama bu konu göz ardı edilemez durumunda.

farklı ide ile denedim. başlangıç 20mb olan ram çok fazla component eklesem bile 20,1 gibi rakamlara cıkıyor gayet normal. tabi projemi fmx geçirmek cok daha kısa sürecektir.
Lütfen benim bilmediğim bir şey varsa yardımcı olursanız sevinirim.
İyi çalışmalar.
Cevapla
#2
bence Ram meselesi takılıcak bir konu değil, birisi direk çalışıyor, değeri arda fmx kullanarak çalıştırıyor. yüklü işlem yapmayacak bir yazılımsa ve mobil dede çalışacak sa FMX kullanmak gerekiyor. ben yeni projelerde VCL yi bıraktım.
Cevapla
#3
bizim proje genelde multi çalışması gerekiyor.
bir kullanıcı gerekirse 100 tane acacak durum böyle olunca büyük problem çıkartıyor.
Cevapla
#4
ister VCL ister FMX proje olsun mutlaka exe oluştuktan sonra sıkıştırmayı deneyin. bu konuda mpress kullanıyorum. 25mblık VCL projem 5mb'a, 65mb lık FMX projem 4mb a kadar düşüyor.

http://www.matcode.com/mpress.htm

kullanımı da çok kolay.. Exe'nizi mpress dosyasının üstüne sürükleyin bırakın.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#5
(28-05-2020, Saat: 21:35)tabikisura10 Adlı Kullanıcıdan Alıntı: Merhaba.
C++ builder windows için uygulama geliştiriyorum.
bir kaç gün önce fmx liste sorunları için konu açmiştim. https://www.delphican.com/showthread.php?tid=4853
@mrmarman teşekkür ederim yardımcı oldu.

yanlız fark ettim. VCL kullandığım zaman aynı kodlar ile 200 tane checbox oluşturuyorum max 5mb kadar ram yiyor.
ama FMX eklediğim zaman 50mb+ yiyor ve bu değer sil ekle yaptıkca artıyor. 15mb kullanırken birden 50mb gibi seviyelere cıkıyor.
temalı temasız denedim VCL göre yinede çok fazla ram yiyor. denemek için 200 tane ekledim. daha cok fazla component ekleyince daha artacaktır.

acaba ben mi bir şeyi yanlış yapıyorum sizde durum böylemi.
teşekkür ederim.

Tahminimce çalışma anında GPU kullandığı için olabilir.
Fakat image ve benzeri bileşenler olmadığı sürece belirttiğiniz miktara ulaşması oldukça güç.
Cevapla
#6
(28-05-2020, Saat: 22:01)mcuyan Adlı Kullanıcıdan Alıntı: ister VCL ister FMX proje olsun mutlaka exe oluştuktan sonra sıkıştırmayı deneyin. bu konuda mpress kullanıyorum. 25mblık VCL projem 5mb'a, 65mb lık FMX projem 4mb a kadar düşüyor.

http://www.matcode.com/mpress.htm

kullanımı da çok kolay.. Exe'nizi mpress dosyasının üstüne sürükleyin bırakın.
teşekkür ederim.
projenin 25 30 mb olması problem değil. çalıştıgında kullandığı ram miktarı çok fazla.
Cevapla
#7
konuya ekleme yaptım verdiğim rahatsızlıktan dolayı özür dilerim
Cevapla
#8
(28-05-2020, Saat: 22:01)mcuyan Adlı Kullanıcıdan Alıntı: ister VCL ister FMX proje olsun mutlaka exe oluştuktan sonra sıkıştırmayı deneyin. bu konuda mpress kullanıyorum. 25mblık VCL projem 5mb'a, 65mb lık FMX projem 4mb a kadar düşüyor.

http://www.matcode.com/mpress.htm

kullanımı da çok kolay.. Exe'nizi mpress dosyasının üstüne sürükleyin bırakın.

Merhabalar,

Exe boyutunu küçültmek sadece dağıtım amacında  ve kod güvenliği için (belli bir ölçüye kadar) çözüm üretebilir.
Sıkıştırılmış exe de (Upx, Mpress vb.)  çalışaya başlayınca hafıza da kendini açarak işlem yapmaya devam ediyor.

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#9
* RAM ölçümü konusunda şöyle bir karşılaştırma sunayım.  
Sadece Process'in kapladığı alanı ölçümlüyoruz. 


ocyjspgzqsac9wzo6mh3.gif

Şimdi de EXEPack edilip imzlanmış EXE'lerin karşılaştırılması.. Sanılan gibi fark göremeyeceksiniz.

mfz9mjqtoxfstvvuhezu.gif

Sonuç olarak :  Windows hafıza yöntimi sizin process ile birlikte EXEPack extract edilen alan kadar yeri ayırmak zorunda. Onun için büyük rakamlar görüyorsunuz. 


Konumuz Delphi değil ama sadece kodların ortak olduğunu göstermek için paylaşayım...

VCL Sample


Uses WinApi.psAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
 i       : Integer;
 cBizim  : Cardinal;
begin
 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label2.Caption := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;
 Memo1.Lines.BeginUpdate;
 Memo2.Lines.BeginUpdate;
 Memo1.Lines.Clear;
 Memo2.Lines.Clear;
 for i := 0 to 9999 do begin
   Memo1.Lines.Add(i.ToString);
   Memo2.Lines.Add(i.ToString);
 end;
 Memo1.Lines.EndUpdate;
 Memo2.Lines.EndUpdate;

 cBizim := CurrentProcessMemory;
 Label4.Caption := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;

 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label6.Caption := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;

end;

function TForm1.CurrentProcessMemory: Cardinal;
var
 MemCounters: TProcessMemoryCounters;
begin
 Result := 0;
 MemCounters.cb := SizeOf(MemCounters);
 if GetProcessMemoryInfo(GetCurrentProcess,
     @MemCounters,
     SizeOf(MemCounters)) then
   Result := MemCounters.WorkingSetSize
 else
   RaiseLastOSError;
end;

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



FMX Sample

Uses WinApi.Windows, WinApi.psAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
 i       : Integer;
 cBizim  : Cardinal;
begin
 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label2.Text := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;
 Memo1.Lines.BeginUpdate;
 Memo2.Lines.BeginUpdate;
 Memo1.Lines.Clear;
 Memo2.Lines.Clear;
 for i := 0 to 9999 do begin
   Memo1.Lines.Add(i.ToString);
   Memo2.Lines.Add(i.ToString);
 end;
 Memo1.Lines.EndUpdate;
 Memo2.Lines.EndUpdate;

 cBizim := CurrentProcessMemory;
 Label4.Text := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;

 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label6.Text := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;
end;

function TForm1.CurrentProcessMemory: Cardinal;
var
 MemCounters: TProcessMemoryCounters;
begin
 Result := 0;
 MemCounters.cb := SizeOf(MemCounters);
 if GetProcessMemoryInfo(GetCurrentProcess,
     @MemCounters,
     SizeOf(MemCounters)) then
   Result := MemCounters.WorkingSetSize
 else
   RaiseLastOSError;
end;

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

Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#10
(10-01-2021, Saat: 16:26)mrmarman Adlı Kullanıcıdan Alıntı: * RAM ölçümü konusunda şöyle bir karşılaştırma sunayım.  
Sadece Process'in kapladığı alanı ölçümlüyoruz. 


ocyjspgzqsac9wzo6mh3.gif

Şimdi de EXEPack edilip imzlanmış EXE'lerin karşılaştırılması.. Sanılan gibi fark göremeyeceksiniz.

mfz9mjqtoxfstvvuhezu.gif

Sonuç olarak :  Windows hafıza yöntimi sizin process ile birlikte EXEPack extract edilen alan kadar yeri ayırmak zorunda. Onun için büyük rakamlar görüyorsunuz. 


Konumuz Delphi değil ama sadece kodların ortak olduğunu göstermek için paylaşayım...

VCL Sample


Uses WinApi.psAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
 i       : Integer;
 cBizim  : Cardinal;
begin
 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label2.Caption := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;
 Memo1.Lines.BeginUpdate;
 Memo2.Lines.BeginUpdate;
 Memo1.Lines.Clear;
 Memo2.Lines.Clear;
 for i := 0 to 9999 do begin
   Memo1.Lines.Add(i.ToString);
   Memo2.Lines.Add(i.ToString);
 end;
 Memo1.Lines.EndUpdate;
 Memo2.Lines.EndUpdate;

 cBizim := CurrentProcessMemory;
 Label4.Caption := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;

 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label6.Caption := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;

end;

function TForm1.CurrentProcessMemory: Cardinal;
var
 MemCounters: TProcessMemoryCounters;
begin
 Result := 0;
 MemCounters.cb := SizeOf(MemCounters);
 if GetProcessMemoryInfo(GetCurrentProcess,
     @MemCounters,
     SizeOf(MemCounters)) then
   Result := MemCounters.WorkingSetSize
 else
   RaiseLastOSError;
end;

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



FMX Sample

Uses WinApi.Windows, WinApi.psAPI;

procedure TForm1.Button1Click(Sender: TObject);
var
 i       : Integer;
 cBizim  : Cardinal;
begin
 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label2.Text := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;
 Memo1.Lines.BeginUpdate;
 Memo2.Lines.BeginUpdate;
 Memo1.Lines.Clear;
 Memo2.Lines.Clear;
 for i := 0 to 9999 do begin
   Memo1.Lines.Add(i.ToString);
   Memo2.Lines.Add(i.ToString);
 end;
 Memo1.Lines.EndUpdate;
 Memo2.Lines.EndUpdate;

 cBizim := CurrentProcessMemory;
 Label4.Text := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;

 TrimAppMemorySize;

 cBizim := CurrentProcessMemory;
 Label6.Text := Format('Memory = %s', [ FormatFloat( '#,###0', cBizim) ]);
Application.ProcessMessages;
end;

function TForm1.CurrentProcessMemory: Cardinal;
var
 MemCounters: TProcessMemoryCounters;
begin
 Result := 0;
 MemCounters.cb := SizeOf(MemCounters);
 if GetProcessMemoryInfo(GetCurrentProcess,
     @MemCounters,
     SizeOf(MemCounters)) then
   Result := MemCounters.WorkingSetSize
 else
   RaiseLastOSError;
end;

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


Hocam yine çok fazla zahmet verdim size.
sadece BeginUpdate() ve EndUpdate() eklemeden önce 30mb+ artıyorken. bunları ekledim 2mb falan artma oldu.
çok teşekkür ederim hocam tekrar. cahillik işte hiç umursamamıştım onları daha öncede eklemiştiniz siz. saolun hocam hayatımı kurtardınız.

SetProcessWorkingSetSize ile birlikte 3mb kadar düştü hocam. gerçek manada hayatımı kurtardınız hocam inanın
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Rest server client UTF8 Problemi burakb44 11 5.586 17-06-2020, Saat: 14:47
Son Yorum: 3ddark
  Dizayn sırasında formlar arası bağlantı problemi adelphiforumz 2 1.281 29-05-2020, Saat: 09:28
Son Yorum: Abdullah ILGAZ
  indy IdTCPServer1 data alma problemi lazarus sadikacar60 3 1.418 24-01-2020, Saat: 16:34
Son Yorum: sadikacar60
  Delphi 7- 4 Adet Tablo Döngü Problemi bsrgmsy 2 1.599 20-05-2019, Saat: 17:17
Son Yorum: bsrgmsy
  Delphi içerisinden SQL çalıştırma problemi (Heterogeneous queries hatası) adelphiforumz 4 2.057 20-03-2019, Saat: 20:25
Son Yorum: adelphiforumz



Konuyu Okuyanlar: 1 Ziyaretçi