Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 3 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Dinamik nesne dizi kullanımı ve ram optimizasyonu
#1
Merhaba,

Saat başına 600-800 işlem (x2 client = 1200-1600) okuma-yazma yapan bir projenin içinde kullanılan bazı object array değişkenler bulunuyor. Bu değişkenler standart bir son kullanıcı pc ile çalıştırıldığında yaklaşık 45~48 saatlik süreçten sonra memory hatası döndürüyor.

Kullanılan array ve detayı;

TMyParam = class(TObject)
Name:string;
Value:string;
end;

TMyParams = array of TMyParam;


Soru-1) TMyParam nesnesi yok edildiği halde kullanılan TMyParams array'i yer işgal eder mi? SetLength(myArray,0) yapılsa yada nil olarak set edilse yer işgal etmeye devam eder mi?

Soru-2) Dinamik nesneler ve dizilerin optimize edilmesi için en pratik yöntem nedir?

Soru-3) Dinamik dizilerin ön bellekteki yerini minimuma nasıl indiririz?

Bonus Soru: Aynı projede kullanılan TAdoConnection ve TAdoQuery nesnelerinin kaç adet bağlantı ve ne kadar yaşam döngüsü olması gerekir?

(Tek AdoConnection ve her işlem için tek AdoQuery mi?)
(Tek AdoConnection ve her işlem için ayrı AdoQuery mi?)
(Her işlem için ayrı AdoConnection ve her işlem için ayrı AdoQuery mi?)
{ talk is cheap show me the code. }
Cevapla
#2
Cevap-1) TMyParams array'i her zaman length kadar yer işgal eder. Daha doğrusu Length*SizeOf(Pointer) kadar. SetLength(xx, 0), xx'in tuttuğu alanı bırakır, xx := nil yapmayın Big Grin
Cevap-2) List, Dictionary.. Dinamikse, lütfen dizi olmasın Wink Bu işin bir de ReAllocate-Move-DeAllocate döngüsü var çünkü..
Cevap-3) Önbellek derken?

Bonus Cevap: Tek TADOConnection olması Connection Pooling yapılabilmesini kuvvetlendirir; eğer ki connection aynı yere açılıyorsa. Farklı kaynaklara açılıyorsa her bir kaynak için bir connection olması gerekir. Ayrıca connection kurmak çok maliyetli bir iş. Açılan bir connection mümkün olduğunca saklanmalı. Query'ler için de "işini göreceğin zaman oluştur, işin bitince yok et" yaklaşımı bellek ve iş yönetimi açısından daha sağlıklı olacaktır kaanatindeyim. Tamam bu da maliyetlidir ama bir connection kurmak kadar değil. Zira mevcut connection üzerinden bir emir olarak inecektir DBMS'e.

Bonus Bonus Soru: Neden TADOQuery? TADOStoredProc olması daha hoş değil mi?

Yorum: TxQuery kullanımını gerçekten dışlıyorum Smile Konu başka başka yerlere çok uzar bunun üzerine fakat, basit bir şekilde şöyle belirteyim: Ad-Hoc query'ler Cache'lenmezler, istatistikleri tutulmaz. DBMS tarafında tüm bu yetenekleri kullanabilmek varken, keyword=performance, neden Ad-Hoc? Ayrıca DBMS zaten yükü olan, konu spesifik işi en iyi kendisi yapan bir sistem. Onun üstlenebileceği bir görevi ek olarak tekrar uygulamaya yüklemek neden?
Me on the move..
WWW
Cevapla
#3
(25-09-2017, Saat: 13:29)The_aLiEn Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlCevap-1) TMyParams array'i her zaman length kadar yer işgal eder. Daha doğrusu Length*SizeOf(Pointer) kadar. SetLength(xx, 0), xx'in tuttuğu alanı bırakır, xx := nil yapmayın Big Grin
Cevap-2) List, Dictionary.. Dinamikse, lütfen dizi olmasın Wink Bu işin bir de ReAllocate-Move-DeAllocate döngüsü var çünkü..
Cevap-3) Önbellek derken?

Bonus Cevap: Tek TADOConnection olması Connection Pooling yapılabilmesini kuvvetlendirir; eğer ki connection aynı yere açılıyorsa. Farklı kaynaklara açılıyorsa her bir kaynak için bir connection olması gerekir. Ayrıca connection kurmak çok maliyetli bir iş. Açılan bir connection mümkün olduğunca saklanmalı. Query'ler için de "işini göreceğin zaman oluştur, işin bitince yok et" yaklaşımı bellek ve iş yönetimi açısından daha sağlıklı olacaktır kaanatindeyim. Tamam bu da maliyetlidir ama bir connection kurmak kadar değil. Zira mevcut connection üzerinden bir emir olarak inecektir DBMS'e.

Bonus Bonus Soru: Neden TADOQuery? TADOStoredProc olması daha hoş değil mi?

Yorum: TxQuery kullanımını gerçekten dışlıyorum Smile Konu başka başka yerlere çok uzar bunun üzerine fakat, basit bir şekilde şöyle belirteyim: Ad-Hoc query'ler Cache'lenmezler, istatistikleri tutulmaz. DBMS tarafında tüm bu yetenekleri kullanabilmek varken, keyword=performance, neden Ad-Hoc? Ayrıca DBMS zaten yükü olan, konu spesifik işi en iyi kendisi yapan bir sistem. Onun üstlenebileceği bir görevi ek olarak tekrar uygulamaya yüklemek neden?

Katkılarınız için teşekkürler. Nil yapıldığında karşılaşılacak sorun nedir? Smile Key-value değerleri tutup her metod için doldur, kullan ve yok et aşamaları için Dictionary daha makûl bir tercih. Ön bellekten kastım client-server uygulamalarda client'a yük bindirilen işlemlerin ram üzerindeki yönetimi. Kavramı hatalı ifade etmiş olabilirim. Özellikle oturum bazlı yönetilen uygulamalarda her oturum için çeşitli süreler ve işlemleri arkaplanda yönetmek ve yaşam döngüsü dışındaki sürelerde yok etmek mi yoksa pasif hale getirmek mi yada benim bilmediğim bir yöntem var mıdır diye açıklayabilirim Smile 

Bonus için; faal sınıflar için tek ado ve tek query barındıran data access sınıfı bulunuyor. İşi olan oluşuyor (query ve storedproc için), kullanılıyor ve yok ediliyor. Connection session süresi kadar faal kalıyor. İkisini de kullanmak gerekiyor hocam Smile bende SP taraftarıyım.

TxQuery konusunda hemfikiriz. DBMS kendi işini yapmalı, kodcu kendi işini Smile
Save
{ talk is cheap show me the code. }
Cevapla
#4
Fazla bir bilgim yok ama anladığım kadarı ile kendi yaptığım işlemleri yazayım.
Önbellek için genelde şu şekilde yapıyorum,

TMyParam = class(TObject)
Name:string[20];
Value:string[20];
end;
TMyParams = array of TMyParam;

255 karakter yerine 20 karakter sınırlaması getiriyorum mesela. Yani veritabanı dizaynındaki her kuralı bu tip işlemlerde de uyguluyorum.

Ayrıca connection olayına gelirsek, @The_aLiEn 'e  katılıyorum, tek connection ve tek query yeterlidir ve ayrıca query yerine StoredProc kullanmak daha mantıklıdır, hem güvenlik, hem hız, hemde ağa yüklenmemek adına.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Tek dizi içinde öncelik sırası belirleme (+10 puan) Abdullah ILGAZ 4 779 29-11-2017, Saat: 12:07
Son Yorum: SimaWB



Konuyu Okuyanlar: 1 Ziyaretçi