JsonDB - SQLite'ta, Json Formatında bir Alternatif

ben sana database hakkında geri billdirim yapmadım ben sadece size eğer onların nasıl kullanılır bölümü olursa daha iyi olacağını böyle iken çoğu kişinin bilmeden kullanacağını söyledim

1 Beğeni

FPS oyunu yapacağım demiştim ya, oradaki cross-air’i bile veritabanına kaydettim :slight_smile:

Oyun diğer projelerim gibi hayatta kalamayacak gibi görünüyor, tek başına zor oluyor. Proje ölürse hepsini tek bir link ile birleştirip buradan paylaşırım.

1 Beğeni

tek başına zor oluyor derken ne demek istediniz tek başınıza yapmakta zorlanıyor musunuz yani

@dildeolupbiten Sizin görüşlerinizi değeri buluyorum ve bu proje hakkında ne düşündüğünüzü merak ediyorum. :slightly_smiling_face:

evet bu cümleden başka nasıl bir anlam çıkardığınızı merak ettim

konumuz bu mu acaba @eXcalibur

1 Beğeni

Öncelikle elinize sağlık. Programı deneme imkanım olmadı henüz, ama koda biraz bakma imkanım oldu. Ekleme, değiştirme, silme, sıralama gibi işlemleri yapan fonksiyonlar ekleyebilirsiniz.

JSON normalde bir veritabanı değildir ama JSON’u veritabanı olarak kullanmamak için hiç bir engel yok.

Ancak JSON sınırlı sayıda veri tipini destekler. Veritabanlarında genelde veri metin tabanlı olarak değil de binary olarak saklanır. Mesela MongoDB, json yapısını esas alan BSON (binary json) isimli bir format kullanır.

Aşağıda aynı veriyi tutan pickle ve json dosyalarının boyutlarının karşılaştırıldığı bir örnek görüyorsunuz.

Örnek:

import os
import json
import pickle

text_based = {
    f"Key-{i}": {
        f"Sub-Key-{j}": j for j in range(100)
    } for i in range(1000)
}

with open("test.json", "w") as f:
    json.dump(text_based, f)
    
with open("test.pickle", "wb") as f:
    pickle.dump(text_based, f)
    
    
print(os.stat("test.json").st_size)
print(os.stat("test.pickle").st_size)

Bu kodları çalıştırdığım zaman aldığım çıktı şöyle:

1792890
1504106

Çıktıya göre, pickle dosyası, json dosyasından yaklaşık 15 % daha az yer kaplıyor.

Dikkat edilmesi gereken önemli noktalardan bir tanesi de darboğaz oluşturmamak. Okunacak verinin hafızayı tüketmemesi gerekiyor.

Ayrıca binary veriden, kullanıcının okuyabileceği metin tabanlı veriye dönüştürme işlemi yaparken de fazladan maliyet oluşmamasına dikkat etmek lazım.

4 Beğeni

Bu, faydalı yorumlarınız için çok teşekkür ederim. :slight_smile:

Onlar henüz sıra gelmedi, hâlâ select fonksiyonunu geliştiriyorum.


Bunu biliyorum, ama tüm verilerin özü 1 ve 0’ dan oluşur; dolayısıyla, Cols değişkeni altında veri tipi belirterek o sütundaki verinin doğru şeklinde okunması sağlanabilir


Verdiğiniz örnek üzerinde bayağı bir kafa yordum, ve şöyle bir kanıya vardım;

Binary dosyaları(en azından pickle), tekrarlanan kısımları değişken gibi kullanarak daha az tekrara düşüyor bu sayede daha az yer kaplıyor.

Sizin verdiğiniz örnekte, içiçe geçmiş pek çok anahtar ve değer vardı; fakat benim tasarladığım veri tabanı modelinde ise; dosya boyutunun büyük bir kısmını oluşturacak olan Rows dizesi olacak.

Bu yönde kendim de birkaç deneme yaptım ama net bir sonuca varamadım.

Neticede bu iki formatı birbirine dönüştürülmesi çok kolay olduğu için, ilerde veri ekleme metodunu yazdığım zaman çok sayıda veri girip; hangisinin daha avantajlı olduğuna karar vereceğim.


Nasıl yani? Bütün verileri tek seferde çekmek yerine, SQLite’ta olduğu gibi select metoduna bir LIMIT parametresi mi eklemeliyim?


Maliyet derken, işlemci gücünden mi bahsediyorsunuz?

Çok sayıda farklı veri tipi var. Örneğin kullanıcı bir byte veya date verisini veritabanına eklemek isteyebilir. Veya kullanıcı kendi oluşturduğu veya bir kütüphanenin sağladığı nesneleri de kullanmak isteyebilir. JSON bu veri tiplerini kullanamaz.

O örnek, sadece veri boyutunu çoğaltmak için tasarlanmış bir örnekti ve pickle ile json dosyaları arasındaki boyut farkını göstermek için kullanmıştım.

Örneği şöyle de değiştirip sonucuna bakabiliriz:

import os
import json
import pickle

data = [("Ali", "Uslu", 25, 5068574787, "Ankara") for i in range(100000)]

with open("test.json", "w") as f:
    json.dump(data, f)
        
with open("test.pickle", "wb") as f:
    pickle.dump(data, f)
        
size1 = os.stat("test.json").st_size
size2 = os.stat("test.pickle").st_size

print("%", 100 - size2 / size1 * 100)

Bu kodları çalıştırdığım zaman, pickle dosyasının boyutunun, json dosyasının boyutundan % 95 daha küçük olduğu ortaya çıkıyor. Vurgulamaya çalıştığım şey dosya boyutları arasındaki farktı.

Bütün verileri çekip, hepsini bir listeye dahil edip, listeyi return etmekten daha kullanışlı yollar aramak lazım. Sonuçta bu bir veritabanı programı. Yani sabit bir boyuta sahip bir veritabanıyla uğraşıyor olsaydınız en azından uğraştığınız verinin boyutunu biliyor olurdunuz. Ama burada veritabanının boyutunun ne olacağı kullanıcıya bağlı ve isterse çok büyük boyutlara sahip veritabanı da kullanabilir. Veritabanının tamamını tek seferde yüklemek istediğimizde ise hafıza yetmeyebilir.

select gibi filtreleyici bir ifade kullanmak, yüklenecek verinin boyutunu azaltabilir elbette.

Veya veritabanı doğrudan bir generator veya bir iterator nesnesine de aktarılabilir. Daha sonradan yapılacak işlemlerle de generator’ün elemanları yapılacak seçimlere göre başka generator nesnelerine aktarılabilir.

Hayır işlemci gücünden bahsetmiyorum. Yani binary veriyi, dönüştürdükten sonra, açığa çıkacak verinin boyutunun hafıza kullanımına olan etkisini göz önünde bulundurmak lazım

1 Beğeni

Yani bir değişkene, BLOB verisi yazıp, daha sonra binary formatta geri okunamaz mı?


Bu ikinci örnekte farkın bu kadar büyük olmasının sebebi; aynı verinin tekrarlanmış olması. Oysa gerçek bir veritabanında çoğu veri birbirinden farklı olur. Dediğim gibi; geçiş kolay olduğu için, bunu daha sonra düşüneceğim.


Son olarak da, madem projenin amacı:

SQLite gibi çalışan ama daha küçük boyutlarda bir veritabanı alternatifi oluşturmak.

Büyük veritabanları için bir çözüm bulmam şart oldu bana. :slight_smile:

Yapılabilir elbette.

Evet, pek uygun bir örnek olmadı.

1 Beğeni

Değeri vaktinizi, bana ayırdığınız için çok teşekkür ederim.

Sayenizde, kafamdaki pek çok sorunun cevabına ulaştım.

İyi günler dilerim. :slight_smile:

1 Beğeni

Rica ederim, iyi çalışmalar dilerim. Diğer arkadaşların da önerilerini alabilirsiniz tabi. Belki önerecekleri yöntemleri duymaya ihtiyacımız vardır.

1 Beğeni

gelenek bu ama kişi pascal case yani bu şekil yazmak isterse yazar.
bu kişinin isteğine ve alışkanlıklarına bağlı

Sizin dediğiniz de doğru tabi; ama @EkremDincel’in şu gönderisi benim için gayet ikna edici oldu.

Zaten tüm alışkanlıklarımdan da vazgeçmiş değilim; mesela 4 boşluk girinti bana fazla geliyor, onun için 2 boşluk ile yazıyorum. :slight_smile:

@EkremDincel yukarıda açıklamış, tekrar uğraşmayacagim.

4 Beğeni

@Samet195 diğer proglamlama dillerinde nasıl kullanılacak.
Sadece python’u destekliyor.

Ona bakılırsa, SQLite’da C ile yazıldı?

Şu an hala geliştirilmekte olduğu için, diğer diller için bir driver yok.

Şuanda ruby’de sqlite3 kullanıyorum ama o nasıl oluyor ?