Forum: Diğer Konular RSS
Kaç elemanlı dizi bilgisayarı kasar?
Abdullah #1
Üye Ağu 2015 tarihinden beri · 48 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kaç elemanlı dizi bilgisayarı kasar?
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?
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Abdullah #3
Üye Ağu 2015 tarihinden beri · 48 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4511 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Abdullah #5
Üye Ağu 2015 tarihinden beri · 48 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yani string uzunluğuna bağlı tamamen evet. teşekkürler!
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-10-21, 03:18:24 (UTC -07:00)