2009-07-10 35 views
7

Tôi cần một cơ sở dữ liệu không có cấu trúc nhỏ cho các tập lệnh Ruby của tôi. Không phải Sqlite, một cái gì đó giống như một hashtables liên tục sẽ hoạt động hoàn hảo, miễn là nó có thể lưu trữ các cấu trúc Ruby cơ bản (mảng, chuỗi, băm, vv - tất cả tuần tự hóa) và sẽ không bị hỏng khi kịch bản Ruby sụp đổ.Hashtable dai dẳng cho các chương trình Ruby?

Tôi biết có rất nhiều giải pháp như vậy cho Perl với Tie :: Hash, vì vậy có thể có một số đá quý như thế đối với Ruby. Đá quý sẽ là gì?

EDIT: Theo như tôi có thể nói các giải pháp PStore và yaml dựa trên việc đọc, unmarshaling, remarshaling và viết toàn bộ cơ sở dữ liệu trên mọi thay đổi. Điều đó không chỉ đòi hỏi tất cả nó để phù hợp với bộ nhớ, đó là O (n^2). Vì vậy, không ai trong số họ có vẻ như một giải pháp đặc biệt tốt.

+0

Tại sao không SQLite? –

+1

Sqlite là phụ trợ lưu trữ khóa-giá trị? Có thể làm việc với một số lớp sử dụng nó để giả vờ đó là một băm. Tôi chỉ hy vọng có một cái đã tồn tại nên tôi sẽ không phải viết nó. Sqlite trực tiếp rõ ràng không phải do thiếu lược đồ, và sự cồng kềnh của SQL trong các tình huống như vậy. – taw

Trả lời

4

Có lẽ FSDB (cơ sở dữ liệu hệ thống tệp) sẽ phù hợp với nhu cầu của bạn.

FSDB là cơ sở dữ liệu hệ thống tệp. FSDB cung cấp một lớp cơ sở dữ liệu an toàn, an toàn với quy trình sử dụng hệ thống tệp gốc làm phần cuối của nó và cho phép nhiều định dạng tệp và các phương thức tuần tự hóa. Người dùng truy cập các đối tượng theo đường dẫn của họ liên quan đến thư mục cơ sở của cơ sở dữ liệu. Trọng lượng rất nhẹ (trạng thái của cơ sở dữ liệu về cơ bản chỉ là một chuỗi đường dẫn và kích thước mã rất nhỏ, dưới 1K dòng, tất cả đều là ruby).

$ sudo gem install fsdb 

Dưới đây là một ví dụ từ các tài liệu:

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

Bạn có thể sử dụng bdb, giao diện Ruby với "Berkeley DB" (liên kết tải xuống từ URL này có vẻ không hoạt động nhưng github có ;-).

3

Nếu dữ liệu là đủ nhỏ để giữ trong bộ nhớ khi chương trình đang chạy, và serialize/deserialize khi xuất cảnh/khởi động, bạn có thể thử YAML. Nó xuất hiện mặc định với Ruby và có thể lưu trữ bất kỳ loại đối tượng nào.

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

sẽ cung cấp cho bạn

--- 
:meh: 42 
:foo: bar 

để tải, chỉ cần làm:

hash = YAML.load(yaml_data) 
10

PStore trong Ruby thư viện chuẩn, không cần phải cài đặt bất cứ điều gì.

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

Bạn đã thử gdbm chưa? Nó đi kèm với Ruby stdlib, thực sự đơn giản và nhanh hơn nhiều so với PStore hoặc YAML.

Các vấn đề liên quan