Pointer'larla Çalışma
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- kara_kule06
- Üye
- Mesajlar: 150
- Kayıt: 18 Nis 2006 02:15
- Konum: ankara/polatlı
- İletişim:
Pointer'larla Çalışma
Herkese Kolay gelsin. Ben Bir Memo nesnesinin içine 10000 satırdan fazla kayıt atıyorum ve bunları satır satır okutup işlem yaptırıyorum(istenilen satırı DB'ye atma vs. ) Tabi bu programı biraz yavaşlatıyor. Sorum şu:
Ben bu memo nesnesinin içindeki bilgileri bir topluca bir pointer'da tutabilirmiyim. Çünkü pointer'da tutarsam program daha hızlı çalışacak. Pointer'larla çalışma hakkında bilgisi olan veya elinde örnek çalışabilir bir kod bulunanlardan rica edyorum kolay gelsin.
Ben bu memo nesnesinin içindeki bilgileri bir topluca bir pointer'da tutabilirmiyim. Çünkü pointer'da tutarsam program daha hızlı çalışacak. Pointer'larla çalışma hakkında bilgisi olan veya elinde örnek çalışabilir bir kod bulunanlardan rica edyorum kolay gelsin.
İlim öğrenmek akıntıya karşı yüzmek gibidir. Ara verildiği zaman gerilenir...
Pointer lar 64 bit (4byte) tir o kadar fazla bilgiyi nasıl tutacaklar ki 
Bilgiyi muhtemelen dosyadan okuyorsunuz.
1. Dosyayı kendiniz açıp PCHAR yada String e okutabilirsiniz.
PCHAR bir char dizisine işaret eden pointer dır. Yani istediğinizi gibi bişi.
2. TMemoryStream kullanabilirsiniz.
TMemo ya benzeyen LoadFromFile gibi methotları vardır. Kullanımı rahat yalnız veriyi işlerken biraz uğraştırabilir.
Kolay gelsin

Bilgiyi muhtemelen dosyadan okuyorsunuz.
1. Dosyayı kendiniz açıp PCHAR yada String e okutabilirsiniz.
PCHAR bir char dizisine işaret eden pointer dır. Yani istediğinizi gibi bişi.
2. TMemoryStream kullanabilirsiniz.
TMemo ya benzeyen LoadFromFile gibi methotları vardır. Kullanımı rahat yalnız veriyi işlerken biraz uğraştırabilir.
Kolay gelsin
- kara_kule06
- Üye
- Mesajlar: 150
- Kayıt: 18 Nis 2006 02:15
- Konum: ankara/polatlı
- İletişim:
- kara_kule06
- Üye
- Mesajlar: 150
- Kayıt: 18 Nis 2006 02:15
- Konum: ankara/polatlı
- İletişim:
tMemoryStream kullanmak isterseniz HELP e bakmanızı öneririm.
okumak için kısaca;
Kolaygelsin.
okumak için kısaca;
Kod: Tümünü seç
Var
X:TMemoryStream;
tempC:Byte;
tempStr:String;
...
tempStr:='';
while X.Position<X.size do
begin
X.Read(tepmC,1);
if not tempC=10 then
tempStr:=tempStr+tempC
else begin
//işimizi yapıyoruz
tempSTR:='';
end;
end;
- kara_kule06
- Üye
- Mesajlar: 150
- Kayıt: 18 Nis 2006 02:15
- Konum: ankara/polatlı
- İletişim:
Selam,
Bilgileri MemoryStream'e aktarmak işinize yaramayacaktır. Sadece bellekte veri transferi yapacaksınız o kadar. Ayrıca optimize edilmiş Borland kodları yerine kendi kodlarınızı kullanacağınız için büyük ihtimalle performans kaybı yaşayacaksınız. Eğer yavaşlama memoye veri aktarırken oluyorsa şunu deneyebilirsiniz. Memo'ya veri eklemeden önce Memo1.Lines.BeginUpdate komutunu çalıştırın. Ekleme işlemi bittikten sonra Memo1.Lines.EndUpdate komutunu çalıştırın. Böylece Memo'ya veri eklerken, Memo kendisini güncellemeyeceğı için bir hayli hız kazanacaksınız.
Ufak bir hatırlatma daha. Yanlış hatırlamıyorsam, Memo'nun 64 KB gibi bir üst limiti vardı, ama bu limit Win9x'de olabilir. Tam hatırlamıyorum. Eğer işleminiz gerçektende satırlar üzerindeyse, size tavsiyem bir grid bileşeni kullanmanızdır.
Kolay gelsin,
Bahadır Alkaç[/quote]
Kesinlikle doğru. Belki sadece bir iki optimizasyon yapılabilir. İşin aslı, Memo'da bu bilgileri tutmak için pointer kullanıyor. TStringList'in kendisi de string tutan bir liste ve bu liste de aslında bir pointer dizisi.memo ya atmak ile tstrings ile çalışmak arasında hız farkı olacağına pek ihtimal vermiyorum. 10000 tane kayıtla ne gibi işlem yaptığınızın ayrıntısını açıklarsanız belki farklı bir çözüm yolu bulunabilir.
kolay gelsin.
Bilgileri MemoryStream'e aktarmak işinize yaramayacaktır. Sadece bellekte veri transferi yapacaksınız o kadar. Ayrıca optimize edilmiş Borland kodları yerine kendi kodlarınızı kullanacağınız için büyük ihtimalle performans kaybı yaşayacaksınız. Eğer yavaşlama memoye veri aktarırken oluyorsa şunu deneyebilirsiniz. Memo'ya veri eklemeden önce Memo1.Lines.BeginUpdate komutunu çalıştırın. Ekleme işlemi bittikten sonra Memo1.Lines.EndUpdate komutunu çalıştırın. Böylece Memo'ya veri eklerken, Memo kendisini güncellemeyeceğı için bir hayli hız kazanacaksınız.
Ufak bir hatırlatma daha. Yanlış hatırlamıyorsam, Memo'nun 64 KB gibi bir üst limiti vardı, ama bu limit Win9x'de olabilir. Tam hatırlamıyorum. Eğer işleminiz gerçektende satırlar üzerindeyse, size tavsiyem bir grid bileşeni kullanmanızdır.
Ufak bir hatayı düzelteyim. Pointer'lar 32 bit işletim sisteminde 32 bittir ve bu yüzden de 4 byte'tır. Ve aslında pointer denilen şey, unsigned integer (DWORD)'tir. Bu yüzden 4 GB'nin üzerindeki dosyalarda veya bellek adreslemelerinde problem olur genelde. Örneğin bazı programların 4 GB'den büyük dosyaları kopyalayamaması buna tipik bir örnektir.Pointer lar 64 bit (4byte) tir o kadar fazla bilgiyi nasıl tutacaklar ki
Kolay gelsin,
Bahadır Alkaç[/quote]
- kara_kule06
- Üye
- Mesajlar: 150
- Kayıt: 18 Nis 2006 02:15
- Konum: ankara/polatlı
- İletişim:
Arkadaşlar verdiğiniz aydınlatıcı bilgiler için hepinize ayrı ayrı teşekkür ederim. ben 10000 tane öğrencinin cevabını bir memoya alıp cevap anahtarıyla karşılaştırıp doğru-yanlış-net hesaplaması yapıyorum. aslında sistem güzel çalışıyor ama biraz yavaş çalıştığı için acaba bunun başka bir yolu(memodan başka) varmı diye sormuştum. cevabımı aldım. Herkese kolay gelsin.
İlim öğrenmek akıntıya karşı yüzmek gibidir. Ara verildiği zaman gerilenir...
Hayallah 4 byte =64 bit yazmışız. 4*8=32 eder tabiki.
Not:
Her satır 255 karekter olsa her karekter 1 byte olsa 2.550.000 byte eder. Memo bunun hepsini okuyabiliyor mu?
1000
Hız farkı olur. Neden? Çünkü memo Lines a özelliğine eklenen karekter satırlarını çizer(yani memo içine yazar). çizim pahalı bir iştir. TStrings çizme işlemi yapmayacağı için hız artışı olur. Bu işin pointerla falan bi ilgisi yok.memo ya atmak ile tstrings ile çalışmak arasında hız farkı olacağına pek ihtimal vermiyorum
Aynı çizmeme durumu nedeniyle MemoryStream de Memo dan hızlı olacaktır. Üstelik Memo nun okuyamayacağı hacimli verileri kolayca okuyacaktır. 10000 satır az değil ve eğer satırlar yeterince uzunsa memo verinin bir kısmını (sonunu) okuyamaz. MemoryStream e isterseniz 100 Mb dahi okutabilirsiniz.Bilgileri MemoryStream'e aktarmak işinize yaramayacaktır.
Not:
Her satır 255 karekter olsa her karekter 1 byte olsa 2.550.000 byte eder. Memo bunun hepsini okuyabiliyor mu?
1000
Selam,
Aslında benzer şeyleri söylüyoruz. Dikkat ederseniz yazdığım mesajda sizin söylediğiniz problemlerin hepsine yönetlik bir çözüm sunuyorum
1. Memo'nun Lines.BeginUpdate, Lines.EndUpdate procedürleri çizim gibi pahalı bir işlemi ortadan kaldırıyor. Bütün loading veya editing işlemi bittikten sonra bir kere paint yapılıyor.
2. Memo'nun bir sınırı olduğunu biliyorum ve haklısınız da. Zaten bununla ilgili bir uyarı, hatırlatma da yapıyorum.
3. Eğer memo sadece veri tutmaktak kullanılıyor ve görsel arabiriminden faydalanılmıyorsa, dediklerinizde haklısınız. O zaman da TMemoryStream yerine TStringList kullanmak daha mantıklı olacaktır. TMemoryStream kullanmak demek, satır sonları için özel bir işlem yapmak demektir. Ama TStringList bunu zaten bizim yerimize yapıyor. TStringList'in de bildiğim kadarıyla üst sınırı sistem (page file dahil) belleği kadar.
Kolay gelsin,
Bahadır Alkaç
Aslında benzer şeyleri söylüyoruz. Dikkat ederseniz yazdığım mesajda sizin söylediğiniz problemlerin hepsine yönetlik bir çözüm sunuyorum
1. Memo'nun Lines.BeginUpdate, Lines.EndUpdate procedürleri çizim gibi pahalı bir işlemi ortadan kaldırıyor. Bütün loading veya editing işlemi bittikten sonra bir kere paint yapılıyor.
2. Memo'nun bir sınırı olduğunu biliyorum ve haklısınız da. Zaten bununla ilgili bir uyarı, hatırlatma da yapıyorum.
3. Eğer memo sadece veri tutmaktak kullanılıyor ve görsel arabiriminden faydalanılmıyorsa, dediklerinizde haklısınız. O zaman da TMemoryStream yerine TStringList kullanmak daha mantıklı olacaktır. TMemoryStream kullanmak demek, satır sonları için özel bir işlem yapmak demektir. Ama TStringList bunu zaten bizim yerimize yapıyor. TStringList'in de bildiğim kadarıyla üst sınırı sistem (page file dahil) belleği kadar.
Kolay gelsin,
Bahadır Alkaç
işletim sistemi ve versiyon farklılıkları ve Enterasan durum
TMemo nun Lines özelliği TStrings olarak tanımlandığına göre, Eğer TMemo nun sınırı var ise bu TStrings ten kaynaklanıyor olmalı. Tabi TMemo Win API lerine de bağlı fakat bu sorun olur mu bilmiyorum. Bu kısım biraz karanlık.
TMemo ile büyük çaplı son çalışmamı Win98 de yapmıştım. Ve o zaman büyük dosyaları açamıyordu.
Fakat şimdi öğrendim ki, TMemo Win Xp de çok büyük dosyaları dahi açabiliyor.(örneğin 45 MB)
Borland a göre; Tstringlist 134,217,728 satır string alabiliyor ve eklenen stringlerin ebatı ile ilgili bir sınır yok. Tabi bellek ve işletim sistemi sınırları burada da geçerli.
Kolay gelsin.
DÜZELTME VE EK BİLGİ:-------------------------------------------------------
Mesele basitmiş, Win API sınırlaması. Microsofttakiler
http://msdn.microsoft.com/library/defau ... ittext.asp burda anlatmışlar.
Kısaca:
NT tabanlı OS larda:2147483646
W95/98 de :65535
TMemo ile büyük çaplı son çalışmamı Win98 de yapmıştım. Ve o zaman büyük dosyaları açamıyordu.
Fakat şimdi öğrendim ki, TMemo Win Xp de çok büyük dosyaları dahi açabiliyor.(örneğin 45 MB)
Borland a göre; Tstringlist 134,217,728 satır string alabiliyor ve eklenen stringlerin ebatı ile ilgili bir sınır yok. Tabi bellek ve işletim sistemi sınırları burada da geçerli.
Kolay gelsin.
DÜZELTME VE EK BİLGİ:-------------------------------------------------------
Mesele basitmiş, Win API sınırlaması. Microsofttakiler
http://msdn.microsoft.com/library/defau ... ittext.asp burda anlatmışlar.
Kısaca:
NT tabanlı OS larda:2147483646
W95/98 de :65535