2009-07-10 8 views
7

Ich brauche eine kleine unstrukturierte Datenbank für meine Ruby-Skripte. Not Sqlite, etwas mehr wie ein persistentes Hashtabellen würde perfekt funktionieren, solange es grundlegende Ruby-Strukturen (Arrays, Strings, Hashes usw. - alle serialisierbar) speichern kann und nicht beschädigt wird, wenn Ruby-Skripte abstürzen.Beständige Hashtabelle für Ruby-Programme?

Ich weiß, es gibt viele Lösungen für Perl mit Tie :: Hash, also gibt es wohl ein Juwel wie dieses für Ruby. Welches Juwel wäre das?

EDIT: So weit ich sagen kann PStore und Yaml-Lösungen basieren auf Lesen, Unmarshalling, Remarshaling und Schreiben der gesamten Datenbank bei jeder Änderung. Das erfordert nicht nur alles, um in den Speicher zu passen, es ist O (n^2). So scheint keiner von ihnen eine besonders gute Lösung zu sein.

+0

Warum sqlite nicht? –

+1

SQLite als Schlüssel-Wert-Speicher-Backend? Könnte mit einem Layer arbeiten, der es benutzt, um vorzutäuschen, dass es ein Hash ist. Ich habe nur gehofft, dass es bereits eine gibt, also muss ich sie nicht schreiben. Sqlite direkt offensichtlich nicht wegen des Mangels an Schema und Schwerfälligkeit von SQL in solchen Situationen. – taw

Antwort

4

Vielleicht FSDB (Dateisystem-Datenbank) wird Ihren Bedürfnissen entsprechen.

FSDB ist eine Dateisystemdatenbank. FSDB bietet eine threadsichere, prozesssichere Datenbankklasse, die das native Dateisystem als Backend verwendet und mehrere Dateiformate und Serialisierungsmethoden zulässt. Benutzer greifen auf Objekte bezogen auf ihre Pfade relativ zum Basisverzeichnis der Datenbank zu. Es ist sehr leicht (der Zustand einer Datenbank ist im Wesentlichen nur eine Pfadzeichenfolge und die Codegröße ist sehr klein, unter 1K Zeilen, alles Ruby).

$ sudo gem install fsdb 

Hier ist ein Beispiel aus der Dokumentation:

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

Sie könnten bdb, Ruby-Schnittstelle zu der "Berkeley DB" verwenden (Download-Link von dieser URL scheint nicht zu funktionieren, aber github tut ;-).

3

Wenn die Daten klein genug ist, im Speicher zu halten, während das Programm läuft, und serialisiert/deserialisiert, wenn beim Beenden/startup, Sie könnte YAML versuchen. Es kommt standardmäßig mit Ruby und kann jede Art von Objekt speichern.

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

geben Sie

--- 
:meh: 42 
:foo: bar 

zu laden, einfach tun:

hash = YAML.load(yaml_data) 
10

Es PStore in der Ruby-Standardbibliothek ist, keine Notwendigkeit, etwas zu installieren.

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

Haben Sie versucht gdbm? Es kommt mit Ruby stdlib, ist wirklich einfach und viel schneller als PStore oder YAML.

Verwandte Themen