Thread overview
Kaç elemanlı dizi bilgisayarı kasar?
Sep 29, 2017
Abdullah
Sep 29, 2017
Abdullah
Sep 29, 2017
Abdullah
September 29, 2017

Uygulama çalışırken veritabanını diziye yüklemek istiyorum, tehlikeli olur mu? Mesela 50.000 elemanlı bi dizi Ram'de kaç MB'lık alan kaplar? Nasıl hesaplayabilirim?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 29, 2017

Peki burada String boş olarak hesaplanıyor heralde. Mesela 30 karakter barındıran string dizisi ne kadar tutar? Bu arada cevabınız ve yazdığınız kod için teşekkür ederim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 29, 2017

Yani string uzunluğuna bağlı tamamen evet. teşekkürler!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 29, 2017

Dizi büyüklüğü, eleman adediyle eleman büyüklüğünün çarpımıdır. (Dizi veri yapısında ek masraf bulunmaz.)

import std.stdio;

struct S {
   char c;
   // (Burada doldurma baytları vardır)
   double d;
   int i;
}

void neKadarYer(size_t adet, T)() {
   enum yer = adet * T.sizeof;
   writefln("%s %s %s bayt yer tutar", adet, T.stringof, yer);

   // Başka bir yolla da hesaplanabildiğini görelim:
   static assert(yer == (T[adet]).sizeof);
}

void main() {
   enum adet = 50_000;
   neKadarYer!(adet, int);
   neKadarYer!(adet, S);
}

'
50000 int 200000 bayt yer tutar
50000 S 1200000 bayt yer tutar
'

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 29, 2017

Gösterdiğim kodda string yoktu ama string'de fark yok: eleman büyüklüğü çarpı eleman adedi. Ancak, yanılmıyorsam bazı veri tabanları dizgileri sabit uzunlukta tutuyorlar. Eğer okurken de o düzene sadık kalıyorlarsa, bütün dizgiler asıl uzunluklarından bağımsız olarak örneğin 100 bayt olabilir.

Dizilerde ek masraf olmadığı doğru ama diziye erişmek için normalde kullanılan dilimlerin de kendi uzunlukları var. Her dilim bir size_t'den ve bir void*'dan oluşur. (64 bitlik ortamda 8 + 8 = 16 bayt.)

Dolayısıyla, string dizilerinde onu da hesaplamak gerekir.

Ek bir masraf daha var: Her dizgi için 100 bayt değil, örneğin 128 bayt ayrılabilir. (Veya 4K, vs.) Dolayısıyla her dizginin sonunda hiç kullanılmayacak olan ek bir masraf da bulunabilir. Aşağıdaki program bunu da hesaplamaya çalışıyor:

import std.stdio;

string dizgiOluştur() {
   // Bu işlemi veri tabanı kütüphanesinin uyguladığını ve okuduğu her dizgi için 100 baytlık yer ayırdığını varsayalım
   return new immutable(char)[](100);
}

string[] dizgiDizisiOluştur(size_t adet) {
   string[] sonuç;
   foreach (i; 0 .. adet) {
       sonuç ~= dizgiOluştur();
   }
   return sonuç;
}

size_t ekMasrafHesapla(string[] dizi) {
   size_t sonuç = 0;
   foreach (ref eleman; dizi) {
       const ekMasraf = eleman.capacity - eleman.length;
       sonuç += ekMasraf;
   }
   return sonuç;
}

void main() {
   enum adet = 10;
   auto dizi = dizgiDizisiOluştur(adet);

   writefln("Dizinin kendisi                : %10s", dizi.length * dizi[0].sizeof);
   writefln("Karakterler için kullanılan yer: %10s", adet * 100);
   writefln("Karakterlerin sonundaki masraf : %10s", ekMasrafHesapla(dizi));
}

'
Dizinin kendisi : 160
Karakterler için kullanılan yer: 1000
Karakterlerin sonundaki masraf : 270
'
Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]