2009-07-10 5 views
7

私はRubyスクリプトのための小さな非構造化データベースが必要です。 Sqliteではなく、Rubyの基本的な構造(配列、文字列、ハッシュなど - すべて直列化可能)を格納できる限り、永続的なハッシュテーブルのようなものは完全に機能し、Rubyスクリプトがクラッシュすると破損することはありません。Rubyプログラムの永続ハッシュテーブル?

私は、Tie :: Hashを使ったPerlのような解決策がたくさんあることを知っています。そのため、おそらくRubyのような宝石があります。それはどんな宝石ですか?

EDIT:PStoreとyamlソリューションは、すべての変更に対してデータベースの読み取り、非マーシャリング、再マーシャリング、および書き込みを行うことができます。それはすべてのものが記憶に合うだけでなく、O(n^2)です。だからどちらも特に良い解決策のように見えません。

+0

SQLiteのではないのはなぜか? –

+1

キー値ストアバックエンドとしてのSqlite?それを使ってそれがハッシュであるとふるっているいくつかの層で動作するかもしれません。私はちょうど既に存在するものがあることを望みましたので、私はそれを書く必要はありません。 Sqliteは、スキーマの欠如とそのような状況でのSQLの煩雑さに直接起因しているわけではありません。 – taw

答えて

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

bdb Rubyの "Berkeley DB"インターフェース(このURLからのダウンロードリンクは動作しないようですが、githubは;-)を使用できます。

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) 
10

Rubyの標準ライブラリ、何もインストールする必要はありませんでPStoreがあります。

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

gdbmを試しましたか?それはRuby stdlibに付属していて、PStoreやYAMLよりもはるかに簡単で、はるかに高速です。