Sözlük için pickle veya sqlite

Merhaba. Sözlük içeriğini pickle ile dosyaya kaydetmek mi, sqlite tablosunu kullanmak mı daha hızlı? Dosyaya kaydedilen datanın bazan program kapatılana kadar tamponda bekletildiği belirtiliyor, bu durum önlenebilir mi, açık dosya işlemlerinde (yeni kayıtlar ve kaydedilen sözlüğün peşpeşe okunması gibi) sorun yaratmaz mı?

Ne hizindan bahsediyoruz? Programin acilma hizi mi? Kaydedilme hizi mi? Aranma/bulunma hizi mi? Kac sozcuk var? Hangi sirayla yaziliyorlar? Hangi sirayla okunacaklar? Okuma:Yazma orani nedir?

Nerede belirtiliyor? Yanlis.

Tek tampon varsa sorun cikmaz; tamponun amaci bu durumu hizlandirmak zaten.


Atomik olmayan dosya yazimlarinda sorun cikabilir. Ayni anda kac process dosyayi kullanacak? Dosya sistemi turu nedir?

İlginize teşekkürler.
1- sözlüğü txt dosyası olarak kaydetmekten bahsediyorum
2- dosyaya erişme ve üzerinde işlem yapma hızını soruyorum. Ya da ne hızı olduğunu bilmiyorum, sizin terminolojinizle tanımlayamıyorum diyelim. “open dosya ve read” ile “im.execute ve im.fetchall” arasındaki hız farkı. Çünkü ben kahrolası bir acemiyim, çaylağım, bir hedefim var ama o hedefe ulaşmak için 4-5 yıl harcayarak sizin gibi temelden öğrenme şansım yok. Yazbel’in sizin gibi “uzmanların” tartışma forumu değil, benim gibi çaylakların sorunlarına yardımcı olma forumu olduğunu sanıyordum.
3- programın işleyişi sırasında sözlüğe yaptığım eklemeler anında text dosyasına kaydolmuyor. tamponda bekliyor derken bunu kastediyorum. Tek tampon ve atomik olmayan dosya nedir bilmiyorum.
4- sqlite ile çalışırken yaptığım eklemeler anında tabloya ekleniyor, programın sonlanmasını beklemiyor.
5- bu sorunu anlattığım bir bil.müh. arkadaşım(python biliyor) “tamponda bekleme” olayından bahsetti, oradan öğrendim. Biraz araştırınca “açık dosya işlemleri” konusundaki kısıtlamalara ulaştım.
(https://docs.python.org/3/library/pickle.html)
6- Yeni öğrenen birisi olarak her ayrıntıda araştırma yapıp dağılmak veya bazı konularda Yazbel gibi yerlerden yardım alarak hedeften sapmadan yolda kaybolmamak gibi seçeneklerim var çok şükür.
7- sorduğum sorudan herhangi bir anlam çıkaramayıp bu kadar işi yokuşa sürme tavrını anlamakta zorlanıyorum. Biraz saygı ve iyiniyet lütfen. Bu sitemim yalnızca aib için, diğer arkadaşları tenzih ederim. İlk defa olmuyor. aib’nin ciddi bir üslup sorunu olduğunu düşünüyorum. Sıfırcı öğretmen tavrı hiç yardımcı olmadığı gibi, yazbel camiasından da soğutuyor açıkçası.

1 Like

Pardon, burada saygisizlik nerede, kotu niyet nerede? (“Siz” yerine “sen” diye hitap etmem ayri; onu herkese yapiyorum)

“Hangisi daha hizli” diye sormussun. Boyle bir sorunun manali olmadigini anlatmaya calisiyorum. Olculecek, optimize edilecek onlarca hiz var. Bunu anlatabilmek icin oturup zaman harcayip degisik hizlardan ornekler verdim. Uzman oldugunu dusundugum insanlara soracagim “hangi hiz” sorusunu actim, "bu hizlardan hangisinden bahsediyor olabilirsin acaba"ya donusturdum. Caylak oldugun icin, yardim etmek icin.

Buna ragmen “dosyaya erisme ve uzerinde islem yapma hizi” demissin mesela. Hangi islemi yapiyorsun?

im.execute dedigin bir database sorgusu calistiriyor muhtemelen. Bos data uzerinde 10 saniye donen sorgu da gordum, milyarlik tabloyu milisaniyelerde tarayan sorgu da. Tek bir sorgunun farkli sistemlerde 100 kat farkli hizlarla calistigini gordum. Hangi sorguyu, hangi sartlar altinda calistirdigini bilmeden nasil “SQLite hizlidir” diyebilirim ki?

Hiza niye ihtiyacin oldugunu sormadim bile. Ama neyin yavas oldugunu belirtirsen yardim etmemiz daha kolaylasir.


Sorunun ikinci kisminda mi? Surada mi? :

Cunku ben bunu hem pickle hem de sqlite yontemiyle ilgili bir soru olarak anladim. Cunku SQLite da datayi dosyaya kaydediyor. Ve bu bahsedilen problemlerin tamamina/coguna karsi onlem alinmis durumda.

Pickle yonteminde boyle sorunlar cikabilir, evet, fakat yeni baslayan birinin ogrenmek icin yazacagi bir sistemde degil. Bu yuzden “kac process calisacak”, “dosya sistemi turu nedir” diye sordum.

Arkadasin sana bu seviyede hic dusunmemen gereken bir detayi eksik* anlatmis. Bu yuzden bu uzman sorusunu sormussun, ama eksik sormussun ve eksik sordugunu fark edebilecek bilgiye/deneyime de sahip degilsin*. Eksikleri dolduracak ve soruyu manali cevaplanabilir kilacak takipci sorular sordugumda da bu tepkiyi aldim iste :frowning:


*: Mecburen, kimsenin beceriksizliginden degil.

Bu sayfada acik dosyalar, herhangi bir limitasyon veya tamponlarla ilgili hic bir sey goremedim; yanlis link olabilir mi?

Haliyle hangi tampondan da bahsettigini bilmiyorum ama butun modern isletim sistemlerinin dosya sistemi katmaninda kullandigi bir tampon var mesela. Bu tampon bir islemin diske yazmak istedigi seyi, baska bir islem tarafindan daha diske yazilmadan okunabilmesini sagliyor mesela; ima edilen problemin tam tersi seklinde.

Vakit ayırdığınız için teşekkür ederim.Evet, verdiğim link yanlış, özür dilerim. Doğrusu: https://wiki.python.org/moin/UsingPickle Burada “What can you Pickle?” paragrafından bahsediyordum.
Buranın üslup sorununu tartışmak için uygun bir yer olmadığını düşünüyorum. Eğer samimi olarak düşüncelerimi öğrenmek istiyorsanız(samimi olduğunuzu hissediyorum yazdıklarınızdan), e-mail adresim nbencan@gmail.com Boş bir mesaj atmanız yeterli.
Sorunuma gelince, forumdan henüz çözüm önerisi alabilmiş değilim. Kendi araştırmalarımla ihtiyacım olan çözümü buldum. (doğru çözüm mü bilmiyorum)
1- Dosya ile çalışmakta tampon sistemi dosyanın açık kalmasını ve program içinde aktif bir kod bloğu olarak kullanılabilmesini sağlıyor, bu iyi. Bunu anlamam için “Tek tampon varsa sorun cikmaz; tamponun amaci bu durumu hizlandirmak zaten.” den biraz fazlası gerekiyordu.
2- Linkte belirtilen sınırlamalar beni nasıl etkileyecek emin değilim, kullanırsam göreceğim.
3- Bu yüzden şimdiye kadar kullandığım sqlite içinde bilgileri depolamak daha emin gibi
4- gelecekte bir hız sorunum olur mu sorusunun cevabı dosya-sqlite ikileminden çok başka faktörlere bağlı imiş, sizden öğrendiğim bu.
İhtiyacım olan, birkaç onbin satırlık datayı çağırıp işlemek için dosya ile mi, tablo ile mi başlayacağıma karar vermekti, hız sorusu bunun içindi. ( Tablolar arası ilişki kullanmıyorum, Non-Sql tarzı yani.) Yolun yarısında sistem değiştirmekten korkuyorum çünkü.(Belki de tablodaki bilgileri gelecekte bir sözlüğe aktarmak zannettiğim kadar zor değildir, bilmiyorum. Ama buna benzer her konuyu araştırarak dallanmalar içinde kaybolmak da istemiyorum. Hem cehaletimin farkındayım, hem de fazla vaktim olmadığının. Belki üç-dört yıl, o da torun izin verirse!) Belki nasıl soracağımı bilemediğim için aradığım cevabı bulamadım ve tabloda devam etmeye karar verdim.
Tekrar teşekkürler.

Burada pickle (daha genis teknik terimiyle serialization) edilemeyen seylerden bahsediyor. State tutan, calismasi bilgisayarin o anki “durumuna” bagli seyleri –acik dosyalar, network baglantilari gibi– diske yazip daha sonra okumanin pek bir manasi yok, onu anlatiyor.

Daha da acmak icin hangi tampondan bahsedildiginden emin olmam gerekiyordu, aslinda hala gerekiyor. Bir process write(2) cagrisini yaptiktan sonra –ama daha diske yazim gerceklesmemisken– ayni isletim sistemi uzerinde baska bir process ayni dosyayi read(2) ederse sorun cikmasini beklemek mantikli. Fakat filesystem cache ikinci read'in diske gitmesini engelledigi icin ilk write'in yazdigi guncel datayi hafizadan donduruyor. Ama bu demek degil ki bu sorun asla cikmaz; arada (Python’da veya pickle'da mesela) baska buffer katmanlari veya gecikmeler varsa sorun hala cikabilir.

O yuzden haril haril bahsedilen sorun cikarabilecek buffer’in ne olabilecegini ariyorum, bulursam okuyup anlasilabilir bir dile cevirebileyim diye.

Yani aslinda bu degisim suna benzedi:

— Insanlarda uc goz varmis, dogru mu?
— Yoo, hayir? Iki goz var? Allah allah. Anatomi kitabi indexine bakar, “goz” diye tanimlanan baska bir organ var mi diye
— Varmis, doktor bir arkadasim soyledi.
Baska kitapta aramaya devam eder

Yukarda cevaplamis oldum sanki, pratikte sinirlamayacak. (Bu arada butun kayit sistemleri icin gecerli tabi ki bu sinirlamalar. Network baglantisi database’e de yazilmaz.)

SQLite’in limitasyonlari pickle'dan daha fazla. Ama kullanmaya devam etmekte bir sakinca yok.

Hiz sorunlarini ciktiklarinda ve olcum yaparak cozmek dogrusu.

Ayrica en pahali zaman programci zamani.

O zaman keske soru bu sekilde gelmis olsaydi. “Baslangicta onemli degil” derdim, “10k’lik datada duz hizi gectim, algoritmik optimizasyonun bir onemli bile yok; satir satir tarasak da olur” derdim. Yolun yarisinda degistirmenin bugun verilecek karar kadar kolay olacagi bir arayuz tasariminin mumkun oldugundan bahsederdim, hatta belki fonksiyon imzalarini bile yazardim.

Tablo dogru kullaniliyorsa ileride sozluge aktarmak hic zor olmaz. Yanlis kullaniliyorsa da once duzeltmenin bedeli her sekilde odenecek nasilsa :​)

Cehaletinin farkinda olmani takdir ediyorum! Ben de farkindayim :​). O yuzden gittim tekrar pickle dokumentasyonunu okudum, filesystem buffer ile filesystem cache’in farkina baktim (yokmus), Python’da ekstra write buffering var mi onu arastirdim (stdout'ta oldugu gibi).

Hatta buralarda takilmamin nedeni de o. Bir yandan temel bilgileri pekistirirken bir yandan yeni kullanicilarin yaptiklari varsayimlari ogreniyorum. Bir yandan da beni baska (“ortalama”) programcilardan ayirdigini dusundugum yaklasimi vermeye calisiyorum: Net ol, bahsettigin seylerin tanimlarini bil; duygusal olma; arastir. Genel kulturumuze ters dustugunun farkindayim—on dakika pil omru konusup pilin icindeki enerjinin hangi birimle olculdugunu bile bilmeyebiliriz.

Bu isler hic belli olmaz. Kim bilir, belki torunu muhtesem bir yazilim muhendisi veya bilgisayar bilimcisi yapariz.


Sadece heves kirdiysam ozur diliyorum. Gerisinin cok bir onemi yok.