Постоянная хеш-таблица для программ на Ruby? - PullRequest
7 голосов
/ 10 июля 2009

Мне нужна небольшая неструктурированная база данных для моих скриптов на Ruby. Не Sqlite, что-то более похожее на постоянные хеш-таблицы будет работать идеально, если оно может хранить базовые структуры Ruby (массивы, строки, хэши и т. Д. - все сериализуемо) и не будет повреждено при сбое скриптов Ruby.

Я знаю, что существует множество подобных решений для Perl с Tie :: Hash, так что, возможно, для Ruby есть и такая штука. Что это за драгоценность?

РЕДАКТИРОВАТЬ: Насколько я могу судить, решения PStore и yaml основаны на чтении, демаршалинге, повторном копировании и записи всей базы данных при каждом изменении. Это не только требует, чтобы все это соответствовало памяти, это O (n ^ 2). Так что ни один из них не кажется особенно хорошим решением.

Ответы [ 6 ]

10 голосов
/ 10 июля 2009

В стандартной библиотеке Ruby есть PStore , установка не требуется.

require 'pstore'
store = PStore.new('store.pstore')
store.transaction do
  store['key'] = 'value'
end
4 голосов
/ 04 марта 2010

Вы пробовали gdbm? Он поставляется с Ruby stdlib, действительно прост и намного быстрее, чем PStore или YAML.

4 голосов
/ 10 июля 2009

Возможно FSDB (база данных файловой системы) подойдет вашим потребностям.

FSDB - это база данных файловой системы. FSDB предоставляет потокобезопасный, безопасный для процесса класс Database, который использует собственную файловую систему в качестве своей внутренней части и допускает несколько форматов файлов и методов сериализации. Пользователи получают доступ к объектам с точки зрения их путей относительно базового каталога базы данных. Это очень легкий вес (состояние базы данных, по сути, просто строка пути, а размер кода очень маленький, менее 1 000 строк, все в рубине).

$ 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
3 голосов
/ 10 июля 2009

Если данные достаточно малы для хранения в памяти во время работы программы и сериализации / десериализации при выходе / запуске, вы можете попробовать 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)
2 голосов
/ 10 июля 2009

Вы можете использовать bdb , интерфейс Ruby для "Беркли БД" (ссылка для скачивания с этого URL, похоже, не работает, но github работает; -).

0 голосов
/ 04 августа 2017

Посмотрите на GDBM: https://ruby -doc.org / stdlib / libdoc / gdbm / rdoc / GDBM.html

Сравнительный тест, включающий PStore: https://gist.github.com/stephan-nordnes-eriksen/6c9c56f63f36d5d100b2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...