Простое, современное, надежное, прозрачное сохранение структур данных для Perl - PullRequest
12 голосов
/ 08 февраля 2011

Я ищу решение для прозрачно персистентных структур данных 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 для экспорта в удобочитаемый формат.

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

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

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

3 голосов
/ 08 февраля 2011

Почему бы не использовать 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 .

2 голосов
/ 08 февраля 2011

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

Некоторые опции:

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