2009-07-10 74 views
7

我需要一個小的非結構化數據庫用於我的Ruby腳本。不是Sqlite,只要可以存儲基本的Ruby結構(數組,字符串,哈希等 - 所有可序列化的),並且在Ruby腳本崩潰時不會損壞,就像持久哈希表一樣,它可以完美工作。Ruby程序的持久哈希表?

我知道有很多針對Perl :: Tie :: Hash的解決方案,所以可能有一些像Ruby那樣的寶石。那會是什麼寶石?

編輯:據我可以告訴PStore和yaml解決方案基於閱讀,解組,編組和整個數據庫上每個變化寫。這不僅要求所有內容都適合內存,而且還是O(n^2)。所以他們都不是一個特別好的解決方案。

+0

爲什麼不SQLite的? – 2009-07-10 19:28:28

回答

4

也許FSDB(文件系統數據庫)將滿足您的需求。

FSDB是一個文件系統數據庫。 FSDB提供了一個線程安全的,過程安全的數據庫類,它使用本機文件系統作爲其後端,並允許多種文件格式和序列化方法。用戶根據其相對於數據庫基本目錄的路徑訪問對象。它的重量非常輕(數據庫的狀態本質上只是一個路徑字符串,並且代碼大小非常小,在1K行以下,所有ruby)。

$ 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更快。