Подтвердить что ты не робот

Простая, современная, надежная, прозрачная стойкость данных для Perl

Я ищу решение для прозрачного сохранения структур данных Perl (даже не объектов, но поддержка объектов будет плюсом) без круговых ссылок. Мне все равно, о бэкэнде, но я бы предпочел JSON. Количество объектов будет относительно низким (несколько тысяч хэш файлов с примерно 5 ключами каждый). Под "прозрачной" настойчивостью я имею в виду, что я не хочу, чтобы каждый раз, когда я обновляю структуру данных в памяти, я должен фиксировать изменения в хранилище.

Вот как выглядит код в идеале:

my $ds;

...
# load the $ds data structure from 'myfile'

print $ds->{foo}->{bar};  # baz
$ds->{foo}->{bar} = 'quux';

... program dies, but the updated %hash has been persisted automatically in 'myfile'

# in another invocation
print $ds->{foo}->{bar};  # quux

До сих пор я смотрел:

Я нашел только один перспективный модуль, DBM:: Deep. Код такой же, как в примере, и вы можете загрузить структуру данных с помощью

my $ds = DBM::Deep->new( "myfile.db" );

Формат двоичный. Не большая проблема, так как я могу использовать JSON для экспорта в удобочитаемый формат.

Итак, я пропустил модуль, и я вообще правильно подхожу к проблеме?

4b9b3361

Ответ 1

Чтобы достичь вашей цели "прозрачности", вам придется либо отнести его к структуре (как предлагалось в chambwez), либо использовать переменные tie d, которые будут сохраняться на диске при каждом обновлении. Хеши DBM используют tie таким образом, поэтому DBM::Deep, вероятно, лучший выбор; все остальное, о чем я знаю, требует, чтобы вы явно рассказывали об этом, когда записывать данные и/или кэшировать записи во имя производительности.

Ответ 2

Почему бы не использовать JSON? Это довольно легко (если я не понял ваш вопрос), все, что вы сделали бы, это следующее:

use JSON;
# serialize to file
open(my $fh, ">myfile");
print $fh encode_json($ds); 
close $fh;
# deserialize from file
open(my $fh, "<myfile");
local $/ = undef;
my $content = <$fh>;
$ds = decode_json($content);
close $fh;

Еще одна простая вещь, которую вы можете сделать, это использовать Data:: Dumper.

Ответ 3

Я не думаю, что прозрачная настойчивость - очень хорошая идея. Предположим, что у вас есть гипотетическая реализация, которая связывает структуру данных perl с внешним миром. Чтобы быть прозрачным, каждая запись в структуру должна быть обнаружена, а данные вне обновления. Это, вероятно, будет довольно дорогостоящим и закончится большим количеством дисковой активности, если у вас нет сложного бэкэнд с быстрым произвольным доступом. Я не могу представить, чтобы обновления файла JSON были эффективными.

Некоторые параметры:

  • использовать бэкэнд базы данных (DBM:: Deep, DB_File или KiokuDB)
  • используйте хранилище ключей в качестве backend (Memcached, Redis)
  • определить согласованный рабочий процесс для данных и сериализовать/десериализовать в хороший момент