Datenbank gesucht

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Hallo,

ich moechte mir eine lokale Datenbank aufbauen, bisher nutze ich ein Dictionary das via pickle aus einer Datei geladen wird. Die Datei ist knapp 300MB gross, dementsprechend dauert das Laden auch, und frisst viel Arbeitsspeicher.

Grundsaetzlich bin ich fuer alles offen, jedoch gefaellt mir das Key Value Prinzip eines Dicts sehr. Mein derzeitiges System sieht so aus:

Gegeben ist eine Liste mit Keyes:

Code: Alles auswählen

key = ['key1', 'key2', 'key3']
Nun ein Modul das ich lade:

Code: Alles auswählen

import dictdb
Ich frage die Values mit dem Key so ab:

Code: Alles auswählen

value = dictdb.werteholen(key)
Rauskommt eine Liste mit den Values:

Code: Alles auswählen

[[val11,val12,val13], [val21,val22,val23], [val31,val32,val33]]
Im Modul "dictdb" wird im Grunde nur ein Dict geladen, die Keys in einer "for" schleife abgefragt, in eine liste gepackt und mit "return" ausgeworfen.

Ziel ist ein System mit einer Datenbasis zu haben, dass ich:
- In jedem Py programm nutzen kann (import XYZ, oder sowas)
- In anderen bereichen wie Bash nutzen kann
- Schnell nutzen kann (in Py), mit dem Dict kann ich ca. 40.000 keyes/sec abfragen, 10.000/s sollten schon drin sein.

Nun brauche ich einen Hinweis, welches System schlagt ihr vor? Ich moechte nicht unzaehlige Durchtesten.
Die neuen NoSQL DBs gefallen mir vom Prinzip her.
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

War im Grunde klar, Thema ist erstellt, ich habe was gefunden: redis[1] und redis-py[2].

[1]http://code.google.com/p/redis/
[2]http://github.com/andymccurdy/redis-py/

Erste schnelle Tests sehen gut aus, pro key jeweils ca 20 Values:

Code: Alles auswählen

 keys      used-mem  clients   requests            connections
 136910    266.66M   1         2518463 (+1)        7            
Edit: Dennoch werden andere Vorschlaege gern angeschaut.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Gabelmensch hat geschrieben:bisher nutze ich ein Dictionary das via pickle aus einer Datei geladen wird.
Hallo Gabelmensch!

http://www.python-forum.de/topic-6157.html
Suche dort nach "Shelve" -- das ist so etwas -- nur mit Cache und ein wenig Drumherum.

Hier http://www.python-forum.de/topic-6848.html sind auch einige DB-Systeme genannt, die nicht mit Tabellen und SQL arbeiten. Als vielversprechende Beispiele möchte ich mal "CouchDB" und "Mongo" nennen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Gabelmensch hat geschrieben:War im Grunde klar, Thema ist erstellt, ich habe was gefunden: redis[1] und redis-py[2].
Ooh, ich bin eher an Tokyo Cabinet und Tyrant interessiert, das solltest du dir ggf. auch anschauen. Hat den Vorteil, dass es sowohl einen "embedded"-Ansatz bietet wie SQLite (Cabinet) als auch einen Server-Ansatz wie PostgreSQL (Tyrant).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Vielen Dank,

Shelve kenne ich, ist auch sehr gut. Funktioniert aber nur in Python. Couchdb habe ich auch getestet. Tokyo Cabinet sehe ich mir die Tage mal an.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Redis ist eine gute Wahl, wenn es kein Problem ist, alle Daten im Hauptspeicher zu halten. Der übliche PC hat heutzutage wohl 8 GB (mit meinen 4GB ist meiner offenbar schon alt ;), da sind dann 300 MB gerade mal 4%. CouchDB finde ich nicht so gut wie MongoDB und das ist für das geschilderte Problem IMHO eine zu große Kanone. Tokyo Dingens fand ich nicht so gut und Cassandra und Riak zu frendartig (obwohl gerade Cassandra in letzter Zeit recht beliebt zu seins scheint). Beide aber IMHO auch zu groß.

Ich bringe aber noch mal Sqlite ins Spiel. Einfach eine Tabelle mit zwei Spalten anlegen und die üblichen Operationen implementieren:

Code: Alles auswählen

import sqlite3

class KVS:
    def __init__(self, name):
        self.conn = sqlite3.connect(name)
        self.conn.isolation_level = None # autocommit
        c = self.conn.cursor()
        c.execute("create table if not exists pairs (k primary key, v)")
        c.close()
    
    def __getitem__(self, key):
        c = self.conn.cursor()
        c.execute("select v from pairs where k=?", (key,))
        row = c.fetchone()
        value = row[0] if row else None
        c.close()
        return value

    def __setitem__(self, key, value):
        c = self.conn.cursor()
        c.execute("insert or replace into pairs (k, v) values (?, ?)", (key, value))
        c.close()
    
    def close(self):
        self.conn.close()

kvs = KVS("/tmp/kvs.db")
print(kvs["sma"])
kvs["sma"] = "ich bin's"
print(kvs["sma"])
Oder man schaut sich das dbm Modul an. Die Sqlite-Lösung hat aber IMHO den Vorteil, dass ich da auch mit anderen Programmen und dem SQLite-Kommandozeilen-Werkzeug selbst drauf zugreifen kann.

Stefan
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

Es sieht so aus, als wenn ich erstmal mit Tokyo Cabinet arbeite. Es ist Pfeilschnell und Grotteneinfach zu bedienen, auch in der Bash. :)
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

CouchDB ist in der Tat für "nur" Schlüssel-Werte Paare zu groß. Bzw. es geht schon, aber es geht sicherlich auch einfacher, s.o. ;-)

Gruß, noisefloor

P.S.: Warum finden alle MongoDB besser als CouchDB??
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

noisefloor hat geschrieben:P.S.: Warum finden alle MongoDB besser als CouchDB??
Ich vermute, das dadurch dass MongoDB in C++ geschrieben ist, ist das Deployment einfacher.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

Hm? Kann etwa jemand _nicht_ in Erlang programmieren? ;-)

Außerdem hat CouchDB die bessere API

So, genug off-topic Gelaber. :D

Gibt es für Tokyo-Dings Python Bindings? Auf der Homepage stand davon nichts...

Gruß, noisefloo
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

noisefloor hat geschrieben: Hm? Kann etwa jemand _nicht_ in Erlang programmieren? ;-)
*meld* :-D
Gibt es für Tokyo-Dings Python Bindings? Auf der Homepage stand davon nichts...
Schon mal bei pypi geguckt? Ich wette mal, dass man da was findet...
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

stimmt: http://pypi.python.org/pypi/tokyocabinet-python/0.4.0.

Ist sogar ziemlich aktuell!

Gruß, noisefloor
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

noisefloor hat geschrieben:Hm? Kann etwa jemand _nicht_ in Erlang programmieren? ;-)
Nee, Erlang ist mir zu mainstream. Davon abgesehen, ist laut Blogosphere Erlang auch keine so interessante Sprache. Wenn man nicht gerade etwas schreiben will, das von den Concurrency-Fähigkeiten profitiert (Mnesia und die Runtime) dann bringt Erlang einem nicht so viel. Für so Datenbanken wie CouchDB ist es vmtl. keine schlechte Wahl und warscheinlich auch geeigneter als C++ was MongoDB verwendet, jedoch hat C++ auf unixoiden System den Vorteil dass es gut etabliert ist und schon ziemlich stabil. Damit kann jeder halbwegs versierte User das installieren, was bei Erlang und CouchDB ggf. etwas aufwändiger sein kann.

Ich hatte aber auch noch nicht die Muße, beide Systeme zu vergleichen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

noisefloor hat geschrieben:P.S.: Warum finden alle MongoDB besser als CouchDB??
Die Sprache, in der CouchDB und MongoDB implementiert sind, ist mir egal. Mir gefällt, dass Mongo eine SQL-ähnliche dynamische Abfragesprache in JavaScript hat. Mir gefällt, dass es in dieser Sprache Operationen gibt, die atomare Operationen erlauben, die so nicht in CouchDB möglich sind. Mir gefällt, dass ihr BSON-Format pragmatischer ist und z.B. häufig benötigte Datetime-Objekte abbilden kann.

Stefan
Gabelmensch
User
Beiträge: 79
Registriert: Montag 12. Oktober 2009, 11:50

noisefloor hat geschrieben:Hallo,

stimmt: http://pypi.python.org/pypi/tokyocabinet-python/0.4.0.

Ist sogar ziemlich aktuell!

Gruß, noisefloor
Ich benutze "pytc" da es in meinem Paketmanager ist. Hast du die Tokyodings db getestet? Fixe einfache Sache oder? :D
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Hast du die Tokyodings db getestet? Fixe einfache Sache oder?
Nee, habe ich nicht. Liegt aber daran, dass ich keine Anwendung haben, die eine reine Key-Value Datenbank braucht.

CouchDB nutze ich, weil die Dokumentorientierung der DB bei mir ganz gut passt.

Gruß, noisefloor
Antworten