Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Out of Memory hatası..
#1
Herkese merhaba.

D7 ile yazmış olduğum bir program var. TCP/IP üzerinden Keyence marka bir barkod okuyucudan aldığı veriyi Memo ve StringGrid alanlarına ekleyerek çalışıyor. PC'de 4 Gb RAM ve i5 CPU var. Veri miktarı 90 bin satıra yaklaştığında Windows, "Out of Memory" hatası veriyor. RAM'i 8 Gb'a çıkarttık bu sefer 180 bin satır olduğunda bu hatayı vermeye başladı. Ancak Zaman zaman programı kapatıp açınca (Program hafızada bir probleme sebep oluyor sanırım) Bazen de, 45 bin satır civarında "Out of memory" diyor. 

Bu problemin kaynağı ne olabilir, Nasıl çözebilirim ?
Teşekkürler.
Cevapla
#2
Merhaba,

Tüm veriyi memo ve/veya string girdde göstermek zorunda mısınız? Bence değilsiniz. Okuduğunuz verinin tamamını hiç bir insan oturup da "tüm veriyi" tek tek okumaz. O noktada bence son 100 veya 500 okumayı göstermeniz, geri kalanını ise veritabanına kaydetmeniz yeterli olmalı...

Delphi 7, 64 bit derleme yapmaz. Dolayısyla 32 bit uygulamalar da maksimum 2 GB bellek adresleyebildiğine göre şu hesabı yapmak çok da zor olmaz herhalde;

Diyelim ki sizin TCP'den aldığınız ve ekranda gösterdiğiniz her bir okuma başına (hangi barkod formatını kullandığınızı bilmiyorum, mesela ean 13 olsun)

13 basamaklı barkod x 90000 adet kayıt = 1170000 bayt eder.

Bu hesaba göre aslında o String Gridde "EN AZ" 1 GB'ı aşkın veri gösteriyorsunuz.  Smile O programın yerinde ben olsam isyan ederdim  Wink

Bunu yapmayın. Herşeyi ekranda göstermek zorunda değilsiniz.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#3
@uparlayan hocamıza katılıyorum. Ekranda verileri gösterdiğiniz zaman sistem kaynakları yetersiz kalıyor. Buna benzer sorunu 2-3 yıl önce ben yaşamıştım. Sonrasında, memtable ile çözmüştüm.
Yazılımcı, kahveyi koda çeviren bir organizmadır.
Cevapla
#4
(28-12-2023, Saat: 00:30)enigma Adlı Kullanıcıdan Alıntı: Herkese merhaba.

D7 ile yazmış olduğum bir program var. TCP/IP üzerinden Keyence marka bir barkod okuyucudan aldığı veriyi Memo ve StringGrid alanlarına ekleyerek çalışıyor. PC'de 4 Gb RAM ve i5 CPU var. Veri miktarı 90 bin satıra yaklaştığında Windows, "Out of Memory" hatası veriyor. RAM'i 8 Gb'a çıkarttık bu sefer 180 bin satır olduğunda bu hatayı vermeye başladı. Ancak Zaman zaman programı kapatıp açınca (Program hafızada bir probleme sebep oluyor sanırım) Bazen de, 45 bin satır civarında "Out of memory" diyor. 

Bu problemin kaynağı ne olabilir, Nasıl çözebilirim ?
Teşekkürler.

projenin dpr dosyasının en başına, 
{$SetPEFlags $0020}
eklereyek tekrar bir deneyin bakın sonuç ne oluyor.

ardından şu yolu deneyebilirsiniz,
https://www.autodesk.com/support/technic...-XP-s.html

eğer out of memory hatasından sonra uygulama kitlenmiyorsa bu yolla handle edilebilinir biraz araştırmanız gerekebilir, böylece dialog suz devam edebilirsiniz.
https://en.delphipraxis.net/topic/8927-h...xceptions/
Cevapla
#5
(28-12-2023, Saat: 16:00)vedat35 Adlı Kullanıcıdan Alıntı:
(28-12-2023, Saat: 00:30)enigma Adlı Kullanıcıdan Alıntı: Herkese merhaba.

D7 ile yazmış olduğum bir program var. TCP/IP üzerinden Keyence marka bir barkod okuyucudan aldığı veriyi Memo ve StringGrid alanlarına ekleyerek çalışıyor. PC'de 4 Gb RAM ve i5 CPU var. Veri miktarı 90 bin satıra yaklaştığında Windows, "Out of Memory" hatası veriyor. RAM'i 8 Gb'a çıkarttık bu sefer 180 bin satır olduğunda bu hatayı vermeye başladı. Ancak Zaman zaman programı kapatıp açınca (Program hafızada bir probleme sebep oluyor sanırım) Bazen de, 45 bin satır civarında "Out of memory" diyor. 

Bu problemin kaynağı ne olabilir, Nasıl çözebilirim ?
Teşekkürler.

projenin dpr dosyasının en başına, 
{$SetPEFlags $0020}
eklereyek tekrar bir deneyin bakın sonuç ne oluyor.

ardından şu yolu deneyebilirsiniz,
https://www.autodesk.com/support/technic...-XP-s.html

eğer out of memory hatasından sonra uygulama kitlenmiyorsa bu yolla handle edilebilinir biraz araştırmanız gerekebilir, böylece dialog suz devam edebilirsiniz.
https://en.delphipraxis.net/topic/8927-h...xceptions/

Yöntem iyi, güzel de soruna çözüm olamaz çünkü @enigma 'nın programının "SINIRSIZ KAYNAKLARI YOK Kİ..." 2GB'da patlayacağına 4 GB'da patlayacak, değişen bir şey olmayacak yani...
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
WWW
Cevapla
#6
(28-12-2023, Saat: 00:30)enigma Adlı Kullanıcıdan Alıntı: Herkese merhaba.

D7 ile yazmış olduğum bir program var. TCP/IP üzerinden Keyence marka bir barkod okuyucudan aldığı veriyi Memo ve StringGrid alanlarına ekleyerek çalışıyor. PC'de 4 Gb RAM ve i5 CPU var. Veri miktarı 90 bin satıra yaklaştığında Windows, "Out of Memory" hatası veriyor. RAM'i 8 Gb'a çıkarttık bu sefer 180 bin satır olduğunda bu hatayı vermeye başladı. Ancak Zaman zaman programı kapatıp açınca (Program hafızada bir probleme sebep oluyor sanırım) Bazen de, 45 bin satır civarında "Out of memory" diyor. 

Bu problemin kaynağı ne olabilir, Nasıl çözebilirim ?
Teşekkürler.
Selamlar,
90-100 bin kayıt sayılarıyla (eğer bir kaydınız 10mb kadar alan kaplamıyorsa) rahatlıkla çalışabilmeniz gerekir. Ben bu kayıt sayılarının çok üzerinde tablolarla çalıştım. 
Muhtemelen ya recursive bir iş yapıyorsunuz ve bir nesne sürekli büyüyor, ya circular olarak 2 proc birbirini çağırıyor. Belki de yüksek miktarda Getmem yapıyorsunuz. 
Sonuçta her satırı tek tek kontrol etmeniz, önce nerede patladığını bulmanız lazım. Sonrası daha kolay tabii ki! Hatanın sebebini bulup düzelteceksiniz.
Olağan şüpheli olarak, son yaptığınız işlemleri kontrol edin. Belki kullandığınız bir bileşen setini güncellediniz o nedenle olabilir. Aramanız lazım.
F8'iniz bol olsun! Smile
Cevapla
#7
Yukarıda çeşitli öneri ve tavsiyelerde bulunulmuş. Bunlara ilave olarak;

Uygulamanız ve gelen verileri nasıl işlediğiniz konusunda bir detay yok ama, sakıncası yoksa gelen veriler 20bin olduğunda memo ve string grid içerisini boşaltın basit ve kolay yöntem (veriler gerekliyse önce kaydedin).

Veritabanı kullanma opsiyonunu değerlendirin.

Veri miktarını (tekrarlanan kayıtlar vb) ve kapladığı alanı küçültmek için optimizasyon yapılacak noktalar varsa değerlendirilebilir.

Gelen tüm veriyi memoda  ve stringgridde tutmanızın özel bir nedeni varmı?
Uygulama normal şekilde kapatılırken veya açılırken bu veriyi ne yapıyorsunuz?

Yukarıda da bahsedildi, kapasiteyi 2GB den 8GB veya 32GB .... XXGB yapsanızda yine bir limit var.  Ne kadarlık (kaç bin satır) bir kapasite sizin uygulama için yeterli olacak?

Yazdıklarımı tekrar okuyunca çok soru sorduğumu fark ettim. Smile Konuyu biraz daha detaylandırırsanız çok farklı çözüm önerilerde gelebilir.
Cevapla
#8
Aslında konuyu fazla detaylandırmadığım için büyük resim anlaşılmamış. Bu veriler ilaç karekodu her kod 60 byte kadar. En fazla da 200 bin kod oluyor. Daha fazlası değil. Ayrıca 1 sn'de ortalama 4 kod okunuyor. Her bir okunan kod memorydeki diğer okunmuş kodlar ile tekrarlı kod var mı diye karşılaştırılıyor. Bu işlemi veri tabanından yapmaya kalkınca 1 sn.de 4 kod yetişmiyor. Yani hızlı değil. Bu yüzden bütün kodları hafızada tutuyorum. Program aynı anda birden fazla iş yapıyor. Bir yandan yazıcıya yazılacak kodları gönderiyor, Bir yandan okuyup değerlendiriyor. Etiket basıyor vs.
Cevapla
#9
(28-12-2023, Saat: 21:51)enigma Adlı Kullanıcıdan Alıntı: Aslında konuyu fazla detaylandırmadığım için büyük resim anlaşılmamış. Bu veriler ilaç karekodu her kod 60 byte kadar. En fazla da 200 bin kod oluyor. Daha fazlası değil. Ayrıca 1 sn'de ortalama 4 kod okunuyor. Her bir okunan kod memorydeki diğer okunmuş kodlar ile tekrarlı kod var mı diye karşılaştırılıyor. Bu işlemi veri tabanından yapmaya kalkınca 1 sn.de 4 kod yetişmiyor. Yani hızlı değil. Bu yüzden bütün kodları hafızada tutuyorum. Program aynı anda birden fazla iş yapıyor. Bir yandan yazıcıya yazılacak kodları gönderiyor, Bir yandan okuyup değerlendiriyor. Etiket basıyor vs.

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;

begin
form1.show;

for i:=1 to 200000 do
begin
 memo1.lines.add(inttostr(i)+' 012345678901234567890123456789012345678901234567890123456789');
 if (i mod 1000)=1 then
 begin
  application.ProcessMessages;
  if application.Terminated then break;
 end;
end;
memo1.lines.SaveToFile('1.txt');

end;

end.

kanımca kodunuzda leak var, problem verinin memo ya veya grid e eklenmesi değildir.
açıklamanıza göre tahminen, report componentleri leak a sebep veriyor olabilir, fastreport da vs vardı bu tarz sorunlar, son sürüme güncelleyin.

200 bin kayıt memo1 nesnesinde.

resim-2023-12-28-222232645.png

savetofile dosya
resim-2023-12-28-222350521.png
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Xmlmapper hatası hbulus 1 163 07-03-2024, Saat: 09:45
Son Yorum: RAD Coder
  UrlDownloadFile Hatası mcuyan 7 803 18-02-2024, Saat: 23:06
Son Yorum: mcuyan
  Gmail Mail Gönderirken Connection Gracefuly Hatası COMMANDX 0 228 02-02-2024, Saat: 15:21
Son Yorum: COMMANDX
  PasLibVlc kurulum hatası Altıner 6 901 15-01-2024, Saat: 18:43
Son Yorum: Altıner
  Integer hatası Altıner 5 812 24-12-2023, Saat: 23:03
Son Yorum: mustafaozpinar



Konuyu Okuyanlar: 1 Ziyaretçi