Frage

Ich brauche eine schnelle, zuverlässige und speichereffiziente Schlüssel - Wert Datenbank für Linux. Meine Tasten sind etwa 128 Bytes, und der Maximalwert Größe 128K oder 256K sein. Das Datenbank-Subsystem sollte nicht mehr als etwa 1 MB RAM verwenden. Die gesamte Datenbankgröße ist 20G (!), Aber nur ein kleiner zufälliger Bruchteil der Daten wird zu einem Zeitpunkt abgerufen. Bei Bedarf kann ich einige Daten Blobs aus der Datenbank (zu regulären Dateien) bewegen, so dass die Größe wird auf 2 GB max. Die Datenbank muss einen Systemabsturz ohne Verlust in letzter Zeit nicht modifizierten Daten überleben. Ich werde etwa 100 mal mehr liest als schreibt. Es ist ein Vorteil, wenn es ein Block-Gerät (ohne Dateisystem) als Speicher benutzen kann. Ich habe keine Client-Server-Funktionalität benötigen, nur eine Bibliothek. Ich brauche Python-Bindings (aber ich kann sie implementieren, wenn sie nicht verfügbar sind).

Welche Lösungen sollte ich, und die man empfehlen Sie?

Die Kandidaten ich davon wissen könnte funktionieren:

  • Tokyo Cabinet (Python-Bindungen sind pytc , siehe auch pytc Beispielcode unterstützt Hashes und B + Bäume, Transaktionsprotokolldateien und die Größe des Eimers Array wird bei der Erstellung der Datenbank festgelegt, der Schreiber die Datei schließen müssen andere eine Chance zu geben; viele kleine Schreibvorgänge mit der Datei für jeden von ihnen Wiederaufnahme sind sehr langsam, der Tyrant-Server mit den vielen kleinen schreibt helfen kann, Geschwindigkeitsvergleich zwischen Tokyo Cabinet, Tokyo Tyrant und Berkeley DB )
  • VSDB (sicher auch auf NFS, ohne Verriegelung, was Barrieren ?; Updates sind sehr langsam, aber nicht so langsam wie in cdb, letzte Version 2003)
  • BerkeleyDB (bietet Crash Recovery, bietet Transaktionen, die bsddb Python-Modul bietet Bindungen)
  • Sambas TDB (mit Transaktionen und Python-Bindings, einige Benutzer CTDB ) ebenfalls verfügbar ; Datei wächst nach vielen Änderungen zu groß; Datei nach vielen Hash-Streit zu langsam wird, keine integrierte Möglichkeit, die Datei neu zu erstellen, sehr schnelles paralleles Updates durch einzelne Hash-Buckets Verriegelung)
  • aodbm (append-only so überlebt einen Systemabsturz, mit Python-Bindungen)
  • hamsterdb (mit Python-Bindungen)
  • C-Baum (reife, vielseitig kommerzielle Lösung mit hohen Leistung, hat eine kostenlose Version mit eingeschränkter Funktionalität)
  • die alte TDB (ab 2001)
  • bitcask (log strukturiert, geschrieben in Erlang)
  • verschiedene andere DBM-Implementierungen (wie GDBM, NDBM, QDBM ,, Perl SDBM oder Ruby, wahrscheinlich haben sie nicht die richtigen Crash Recovery)

Ich will nicht diese verwenden:

  • memcachedb (Client-Server verwendet BereleleyDB als Backend)
  • cdb (muss die gesamte Datenbank auf jedem Schreib regenerieren)
  • http://www.wildsparx.com/apbcdb/ (dito)
  • Redis (hält die gesamte Datenbank im Speicher)
  • SQLite (es ohne periodische Vakuumieren sehr langsam wird, sehen die automatische Vervollständigung in der in der Adressleiste in Firefox 3.0, obwohl Versionen 3.1 und später von sQLite auto_vacuuming erlauben, passen sie auf: kleine Schreibtransaktionen kann sehr langsam sein, passen sie auf: wenn ein Besetzt Prozess viele Transaktionen tut, andere Prozesse zu verhungern, und sie können nie das Schloss)
  • erhalten
  • MongoDB (zu schwergewichtige, behandeln Werte als Objekte mit interner Struktur)
  • Firebird (SQL-basierte RDBMS auch schwergewichtige )

FYI, ein kürzlich erschienenen Artikel über Schlüssel - Wert Datenbanken im Linux-Magazin.

FYI, ein ältere Software-Liste

FYI, ein Geschwindigkeitsvergleich von memcachedb, Redis und Tokyo Cabinet Tyrant

ähnliche Fragen auf Stackoverflow:

War es hilfreich?

Lösung

Ich habe viel Glück mit dem Tokyo Cabinet / pytc Lösung hat. Es ist sehr schnell (ein bisschen schneller als die shelve Modul in meiner Implementierung mit anydbm), sowohl für das Lesen und Schreiben (obwohl ich zu weit mehr lesen tun). Das Problem war für mich die spartanisch Dokumentation über die Python-Anbindung, aber es ist genug, um Beispiel-Code um herauszufinden, wie zu tun, was Sie tun müssen. Darüber hinaus ist tokyo Schrank ganz einfach zu installieren (wie die Python-Bindings sind), kein Server erforderlich (wie Sie erwähnen) scheint und aktiv unterstützt werden (stabil, aber nicht mehr aktiv weiterentwickelt) . Sie können Dateien im schreibgeschützten Modus öffnen, die gleichzeitigen Zugriff erlaubt oder / Schreibmodus lesen, andere Prozesse zu verhindern, dass auf die Datenbank zugreifen.

Ich war an verschiedenen Optionen über den Sommer suchen, und der Rat, den ich bekam, war dann das: versuchen, die verschiedenen Optionen und sehen, was für Sie am besten funktioniert. Es wäre schön, wenn es einfach eine „beste“ Option, aber jeder sucht etwas andere Eigenschaften und ist bereit, verschiedene Kompromisse zu machen. Sie wissen am besten.

(Das heißt, würde es für andere nützlich sein, wenn Sie geteilt, was das Beste für Sie arbeiten am Ende, und warum Sie diese Lösung über andere gewählt haben!)

Andere Tipps

LMDB ist die speichereffiziente Datenbank um http://symas.com/mdb/inmem/

vollständig crashsicher -

und auch die zuverlässigste erwiesen. http://wisdom.cs.wisc.edu/workshops/spring -14 / Gespräche / Thanu.pdf

Von denen, die Sie erwähnt haben, hat Tokyo Cabinet Korruption Fragen dokumentiert https://www.google.com/search?q=cfengine+tokyo + Schrank + Korruption

BerkeleyDB hat auch gut dokumentierte Fragen der Korruption, wie auch Bitcask. (Und bitcask ist ein In-Memory-only DB sowieso, also nutzlos für Ihre 1MB RAM-Anforderung.)

LMDB wird auch in Python gut unterstützt, mit ein paar verschiedenen Bindungen zur Verfügung. https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

Disclaimer - Ich bin der Autor von LMDB. Aber diese Fakten dokumentiert. LMDB der kleinste ist, effizienteste und zuverlässigste Schlüssel / Wert-Speicher der Welt und nichts anderes kommt überall in der Nähe

cdb jede Datenbank bis zu 4 GB verarbeiten kann, ist es zu klein für die 20GB Angelegenheit zur Hand zu machen.

Riak läuft auf Linux, und ermöglicht es Ihnen, dynamisch Knoten hinzufügen

, wie etwa Python 3.0 ist dbm.ndbm?

Ein weiterer Vorschlag ist TDB (ein Teil des Samba-Projekts). Ich habe es durch die tdb Modul, aber ich kann nicht sagen, dass ich ve Zuverlässigkeit auf Abstürze getestet; die Projekte, die ich früher in nicht solche Anforderungen haben, und ich kann nicht relevante Dokumentation.

, wie etwa eine SQLite?

ich verwendet habe, bsddb.hashlib () mit Python, es funktionierte ziemlich gut.

Vielleicht möchten Sie djb 's cdb , die die Eigenschaften haben Sie erwähnen.

meine Anfrage für eine plattformübergreifende ISAM-style-Datenbank (ähnlich), erhielt ich auch Vorschläge für die integrierte Version von Firebird und GLib .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top