Seite 1 von 1

Datenbank gesucht

Verfasst: Freitag 26. März 2010, 19:39
von Gabelmensch
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.

Verfasst: Freitag 26. März 2010, 21:12
von Gabelmensch
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.

Re: Datenbank gesucht

Verfasst: Freitag 26. März 2010, 21:29
von gerold
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
:-)

Verfasst: Samstag 27. März 2010, 00:47
von Leonidas
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).

Verfasst: Samstag 27. März 2010, 06:43
von Gabelmensch
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.

Verfasst: Samstag 27. März 2010, 12:22
von sma
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

Verfasst: Samstag 27. März 2010, 16:11
von Gabelmensch
Es sieht so aus, als wenn ich erstmal mit Tokyo Cabinet arbeite. Es ist Pfeilschnell und Grotteneinfach zu bedienen, auch in der Bash. :)

Verfasst: Sonntag 28. März 2010, 14:42
von noisefloor
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??

Verfasst: Sonntag 28. März 2010, 14:52
von Leonidas
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.

Verfasst: Sonntag 28. März 2010, 15:05
von noisefloor
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

Verfasst: Sonntag 28. März 2010, 15:19
von Hyperion
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...

Verfasst: Sonntag 28. März 2010, 15:32
von noisefloor
Hallo,

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

Ist sogar ziemlich aktuell!

Gruß, noisefloor

Verfasst: Sonntag 28. März 2010, 23:20
von Leonidas
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.

Verfasst: Montag 29. März 2010, 08:57
von sma
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

Verfasst: Montag 29. März 2010, 16:29
von Gabelmensch
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

Verfasst: Montag 29. März 2010, 18:13
von noisefloor
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