2009-07-10 6 views
7

J'ai besoin d'une petite base de données non structurée pour mes scripts Ruby. Non pas Sqlite, quelque chose de plus comme une table de hachage persistante fonctionnerait parfaitement, tant qu'elle peut stocker des structures Ruby basiques (tableaux, chaînes, hachages, etc.) toutes sérialisables et ne sera pas corrompue quand les scripts Ruby tomberont en panne.Hachette persistante pour les programmes Ruby?

Je sais qu'il y a beaucoup de solutions comme ça pour Perl avec Tie :: Hash, donc il y a probablement de la gemme comme ça pour Ruby. Quelle gemme serait-ce? EDIT: Pour autant que je sache, les solutions PStore et yaml reposent sur la lecture, le démarquage, le remarshaling et l'écriture de bases de données complètes à chaque modification. Cela ne demande pas seulement à la mémoire, c'est O (n^2). Donc, aucun d'entre eux ne semble être une solution particulièrement bonne.

+0

Pourquoi ne pas SQLite? –

+1

Sqlite en tant que backend de magasin de valeur-clé? Peut-être travailler avec une couche qui l'utilise pour prétendre que c'est un hachage. J'espérais juste qu'il y en aurait déjà un, donc je n'aurai pas à l'écrire. Sqlite directement évidemment pas en raison de l'absence de schéma, et la lourdeur de SQL dans de telles situations. – taw

Répondre

4

Peut-être FSDB (base de données du système de fichiers) répondra à vos besoins.

FSDB est une base de données de système de fichiers. FSDB fournit une classe de base de données sûre pour les threads et sécurisée pour les processus qui utilise le système de fichiers natif comme backend et autorise plusieurs formats de fichiers et méthodes de sérialisation. Les utilisateurs accèdent aux objets en termes de chemins par rapport au répertoire de base de la base de données. C'est très léger (l'état d'une base de données est essentiellement juste une chaîne de chemin, et la taille du code est très petite, sous les lignes de 1K, tout ruby).

$ sudo gem install fsdb 

Voici un exemple de la documentation:

require 'fsdb' 

db = FSDB::Database.new('/tmp/my-data') 

db['recent-movies/myself'] = ["LOTR II", "Austin Powers"] 
puts db['recent-movies/myself'][0]    # ==> "LOTR II" 

db.edit 'recent-movies/myself' do |list| 
    list << "A la recherche du temps perdu" 
end 
2

Vous pouvez utiliser bdb, l'interface Ruby à la "Berkeley DB" (lien de téléchargement de cette URL ne semble pas fonctionner, mais github fait ;-).

3

Si les données sont suffisamment petites pour garder en mémoire lorsque le programme est en cours d'exécution, et linéariser/désérialiser lorsque la sortie/démarrage, pourrait essayer YAML. Il vient par défaut avec Ruby et peut stocker n'importe quel type d'objet.

require 'yaml' 
hash = { :foo => 'bar', :meh => 42 } 
yaml_data = hash.to_yaml 
puts yaml_data 

vous donnera

--- 
:meh: 42 
:foo: bar 

de charger, il suffit de faire:

hash = YAML.load(yaml_data) 
10

Il est PStore dans la bibliothèque standard Ruby, pas besoin d'installer quoi que ce soit.

require 'pstore' 
store = PStore.new('store.pstore') 
store.transaction do 
    store['key'] = 'value' 
end 
4

Avez-vous essayé gdbm? Il est livré avec Ruby stdlib, est vraiment simple et beaucoup plus rapide que PStore ou YAML.

Questions connexes