Ruby程序的持久哈希表?

时间:2009-07-10 14:47:06

标签: ruby

我的Ruby脚本需要一个小的非结构化数据库。不是Sqlite,更像是持久化哈希表的东西可以完美地工作,只要它可以存储基本的Ruby结构(数组,字符串,哈希等 - 所有可序列化的),并且在Ruby脚本崩溃时不会被破坏。

我知道有很多类似于Perl和Tie :: Hash的解决方案,所以对于Ruby来说可能有类似的宝石。那是什么宝石?

编辑:据我所知,PStore和yaml解决方案基于读取,解组,重新编组和在每次更改时编写整个数据库。这不仅要求所有它都适合内存,它是O(n ^ 2)。所以它们都不是一个特别好的解决方案。

6 个答案:

答案 0 :(得分:10)

Ruby标准库中有PStore,无需安装任何内容。

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

答案 1 :(得分:4)

或许FSDB(文件系统数据库)可以满足您的需求。

  

FSDB是一个文件系统数据库。 FSDB提供了一个线程安全的,过程安全的数据库类,它使用本机文件系统作为后端,并允许多种文件格式和序列化方法。用户根据其相对于数据库基本目录的路径访问对象。它的重量非常轻(数据库的状态基本上只是一个路径字符串,代码大小非常小,低于1K行,都是红宝石)。

$ sudo gem install fsdb

以下是文档中的示例:

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 :(得分:4)

你试过gdbm吗?它带有Ruby stdlib,非常简单,比PStore或YAML快得多。

答案 3 :(得分:3)

如果数据足够小以在程序运行时保留在内存中,并在退出/启动时序列化/反序列化,则可以尝试YAML。它默认使用Ruby,可以存储任何类型的对象。

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

会给你

--- 
:meh: 42
:foo: bar

加载,只需执行:

hash = YAML.load(yaml_data)

答案 4 :(得分:2)

您可以使用bdb,Ruby接口连接到“Berkeley DB”(此URL的下载链接似乎不起作用,但github会起作用; - )。

答案 5 :(得分:0)