2009-07-10 12 views
7

Necesito una pequeña base de datos no estructurada para mis scripts de Ruby. No Sqlite, algo más parecido a un hashtables persistente funcionaría perfectamente, siempre que pueda almacenar estructuras básicas de Ruby (matrices, cadenas, hashes, etc., todas serializables) y no se corromperá cuando se bloqueen los scripts de Ruby.Tabla hash persistente para programas de Ruby?

Sé que hay muchas soluciones como esa para Perl con Tie :: Hash, por lo que probablemente haya alguna gema así para Ruby. ¿Qué gema sería eso?

EDITAR: Por lo que puedo decir, las soluciones de PStore y yaml se basan en la lectura, la eliminación de marcas, el registro posterior y la escritura de bases de datos completas en cada cambio. Eso no solo requiere que todo se ajuste a la memoria, es O (n^2). Entonces ninguno de ellos parece una solución particularmente buena.

+0

Por qué no SQLite? –

+1

Sqlite como un back-end de almacenamiento clave-valor? Podría funcionar con alguna capa que lo use para pretender que es un hash. Solo esperaba que hubiera uno ya existente, así que no tendré que escribirlo. Sqlite directamente, obviamente, no debido a la falta de esquema, y ​​engorroso de SQL en tales situaciones. – taw

Respuesta

4

Quizás FSDB (base de datos del sistema de archivos) se adapte a sus necesidades.

FSDB es una base de datos del sistema de archivos. FSDB proporciona una clase de base de datos segura para subprocesos y segura para el proceso que usa el sistema de archivos nativo como su back-end y permite múltiples formatos de archivos y métodos de serialización. Los usuarios acceden a los objetos en términos de sus rutas relativas al directorio base de la base de datos. Es muy liviano (el estado de una base de datos es esencialmente solo una cadena de ruta, y el tamaño del código es muy pequeño, bajo 1K líneas, todo rubí).

$ sudo gem install fsdb 

He aquí un ejemplo de la documentación:

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

Puede usar bdb, interfaz de Ruby para el "Berkeley DB" (el enlace de descarga de esta URL parece no funcionar, pero github lo hace ;-).

3

Si los datos son lo suficientemente pequeño como para mantener en la memoria mientras se ejecuta el programa, y ​​serializar/deserializar cuando a la salida/puesta en marcha, se podría probar YAML. Viene por defecto con Ruby y puede almacenar cualquier tipo de objeto.

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

le dará el

--- 
:meh: 42 
:foo: bar 

a cargar, sólo tiene que hacer:

hash = YAML.load(yaml_data) 
10

No es PStore en la librería estándar de Ruby, no hay necesidad de instalar nada.

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

¿Has probado gdbm? Viene con Ruby stdlib, es realmente simple y mucho más rápido que PStore o YAML.