Domanda

Ho bisogno di una, chiave affidabile e la memoria-veloce ed efficiente - database di valore per Linux. Le chiavi sono circa 128 byte, e la dimensione massima valore possono essere 128K o 256K. Il sottosistema di database non dovrebbe usare più di circa 1 MB di RAM. La dimensione totale del database è 20G (!), Ma solo una piccola frazione a caso dei dati si accede alla volta. Se necessario, posso spostare alcuni blob di dati dal database (per i file regolari), quindi la dimensione scende a 2 GB al massimo. Il database deve sopravvivere a un crash del sistema, senza alcuna perdita di dati recentemente modificati. Avrò circa 100 volte più letture di scrittura. È un vantaggio se si può utilizzare un dispositivo di blocco (senza file system) come deposito. Non ho bisogno di funzionalità client-server, solo una libreria. Ho bisogno binding Python (ma posso implementare loro se non sono disponibili).

Quali soluzioni dovrei prendere in considerazione, e che uno mi consiglia?

I candidati che conosco che potrebbe funzionare:

  • Tokyo Cabinet (binding Python sono pytc , puoi anche pytc codice di esempio , supporta hash e B + alberi, i file di log delle transazioni e di più, la dimensione dell'array benna è fissata al momento della creazione del database, lo scrittore deve chiudere il file per dare agli altri la possibilità; un sacco di piccole scrive con riaprire il file per ciascuno di essi sono molto lenti, il server Tiranno può aiutare con i lotti di piccole scrive; confronto di velocità tra Tokyo Gabinetto, Tokyo Tyrant e Berkeley DB )
  • VSDB (sicuro anche su NFS, senza bloccare; per quanto riguarda le barriere ?; aggiornamenti sono molto lento, ma non lento come nel CDB, ultima versione del 2003)
  • BerkeleyDB (fornisce crash recovery, fornisce transazioni; il modulo bsddb Python fornisce attacchi)
  • di Samba TDB (con transazioni e binding Python, alcuni utenti sperimentato la corruzione , a volte mmap()s l'intero file, l'operazione repack volte raddoppia la dimensione del file, produce fallimenti misteriosi se il database è più grande di 2G (anche su sistemi a 64 bit), l'implementazione di cluster ( CTDB ) anche disponibili ; il file diventa troppo grande, dopo un sacco di modifiche; file diventa troppo lento dopo un sacco di hash contesa; nessun modo integrato per ricostruire il file; molto veloci aggiornamenti parallele bloccando singoli secchi hash)
  • aodbm (append-only così sopravvive un crash di sistema, con binding Python)
  • Hamsterdb (con binding Python)
  • C-albero (, soluzione commerciale versatile maturo con elevate prestazioni, ha un edizione gratuita con funzionalità ridotte)
  • TDB (dal 2001)
  • bitcask (log-strutturato, scritto in Erlang)
  • varie altre implementazioni DBM (come GDBM, NDBM, QDBM ,, SDBM del Perl o Ruby, probabilmente non hanno corretto recupero crash)

Non userò questi:

  • MemcacheDB (client-server, utilizza BereleleyDB come backend)
  • CDB (deve rigenerare l'intero database su ogni scrittura)
  • http://www.wildsparx.com/apbcdb/ (idem)
  • Redis (mantiene l'intero database in memoria)
  • SQLite (diventa molto lento, senza aspirazione periodica, vedere il completamento automatico nella nella barra degli indirizzi di Firefox 3.0, anche se le versioni 3.1 e successive di SQLite consentire auto_vacuuming; attenzione: piccole transazioni di scrittura può essere molto lento, attenzione: se un processo occupato sta facendo molte transazioni, altri processi morire di fame, e non potranno mai ottenere il blocco)
  • MongoDB (troppo pesante, tratta valori come oggetti con struttura interna)
  • Firebird (RDBMS SQL-based, troppo pesante )

Cordiali saluti, un recente articolo sulla chiave - basi di dati di valore nella rivista Linux.

Cordiali saluti, un software precedente elenco

Cordiali saluti, un confronto la velocità di MemcacheDB, Redis e Tokyo Gabinetto Tyrant

Domande correlate su StackOverflow:

È stato utile?

Soluzione

Ho avuto buona fortuna con la soluzione / pytc Tokyo Gabinetto. E 'molto veloce (un po' più veloce rispetto all'utilizzo del modulo shelve utilizzando anydbm nella mia implementazione), sia per la lettura e la scrittura (anche se troppo faccio molto più lettura). Il problema per me era la documentazione spartano sui binding Python, ma non c'è codice di esempio intorno abbastanza per capire come fare ciò che è necessario fare. Inoltre, Tokyo cabinet è abbastanza facile da installare (come lo sono i binding Python), non necessita di un server (come si parla) e sembra essere sostenuta attivamente (stabile, ma non è più in fase di sviluppo attivo) . È possibile aprire i file in modalità di sola lettura, che consente l'accesso simultaneo, o modalità lettura / scrittura, impedendo ad altri processi di accedere al database.

Stavo guardando le varie opzioni durante l'estate, e il consiglio ho ottenuto poi è stato questo: provare le diverse opzioni e vedere che cosa funziona meglio per voi. Sarebbe bello se ci fosse semplicemente un'opzione di "migliore", ma ognuno è alla ricerca di caratteristiche leggermente diverse e sono disposti a fare diversi compromessi. Lo sai meglio.

(Detto questo, sarebbe utile per gli altri se hai condiviso quello che ha finito per lavorare il meglio per voi, e perché avete scelto questa soluzione rispetto ad altri!)

Altri suggerimenti

LMDB è il database più memoria efficiente intorno http://symas.com/mdb/inmem/

e anche dimostrato di essere il più affidabile - completamente crash-proof. http://wisdom.cs.wisc.edu/workshops/spring -14 / colloqui / Thanu.pdf

di quelli che hai citato, Tokyo Gabinetto ha documentato problemi di corruzione https://www.google.com/search?q=cfengine+tokyo + cabinet + corruzione

BerkeleyDB anche è ben documentato problemi di corruzione, come fa Bitcask. (E bitcask è un in-memory-solo DB comunque, quindi inutile per il vostro requisito 1 MB RAM.)

LMDB è anche ben supportato in Python, con un paio di diversi attacchi disponibili. https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

Disclaimer - Io sono l'autore di LMDB. Ma questi sono fatti documentati:. LMDB è il negozio chiave / valore più piccolo, più efficiente e più affidabile in tutto il mondo e nient'altro arriva da nessuna parte vicino

CDB in grado di gestire qualsiasi database fino a 4 GB, il che rende troppo piccolo per la materia 20GB a portata di mano.

Riak gira su Linux, e consente di aggiungere dinamicamente nodi

come su dbm.ndbm Python 3.0?

Un altro suggerimento è TDB (una parte del progetto Samba). L'ho usato attraverso il TDB modulo, tuttavia non posso dire io' ve testato sua affidabilità incidenti; i progetti che ho usato in non hanno tali requisiti, e non riesco a trovare la documentazione relativa.

Come su uno SQLite?

Ho usato bsddb.hashlib () con Python, ha funzionato abbastanza bene.

Come si potrebbe djb 's CDB , che ha le proprietà di cui parli.

mia domanda per un cross-piattaforma di database ISAM-stile (simile), ho anche ricevuto proposte per la versione integrata di Firebird e GLib .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top