Какой бэкэнд KiokuDB подходит для моих нужд сериализации? - PullRequest
3 голосов
/ 26 октября 2010

Я использую KiokuDB для хранения пары объектов Moose и пары простых структур массива (хэши и массивы).

Мне не нужны какие-либо необычные поиски, транзакции и т. Д.., простая возможность получить (lookup) объект.Кроме того, как только я закончу создание БД, она может быть установлена ​​только для чтения.В него не будет внесено никаких изменений.

Основная (единственная?) Причина, по которой я использую KiokuDB, заключается в том, чтобы сохранить граф объектов.

Самый большой объект, который доминирует над общим размером БД,является объектом Moose, в котором содержится относительно большой массив (назовем этот объект large_obj).Ранее я сохранял large_obj (один), используя Storable + PerlIO::gzip или даже JSON + PerlIO::gzip.Он работал нормально, и я был очень доволен результатами (использование gzip сжало файл хранилища примерно до 5% от его первоначального размера).

Есть еще один, меньший объект Moose, который в основном представляет собой массивоколо 20-30 тысяч маленьких объектов Moose.

Теперь, после миграции на KiokuDB, я сначала использовал простой бэкэнд Hash, затем выгрузил его в файл (используя Cmd) с помощью PerlIO::gzip снова.Это работало очень хорошо в тех случаях, когда large_obj было относительно небольшим, но как только оно стало больше, я просто вышел из ошибок памяти.Я полагаю, что зашитый хэш не подходит для больших объектов.

Затем я попробовал рекомендованный беркли Беркли, хотя это кажется излишним (как уже упоминалось, мне не нужны все причудливые возможности БД).Он работает намного медленнее, чем оригинальное решение Storable + PerlIO::gzip, занимает гораздо больше места, а также не хватает памяти для более крупных объектов!(Я использую 3GB RAM Ubuntu).

Я также пробовал Files Backend , но он не работает с:

Too many open files at /usr/local/perls/perl-5.12.2/lib/site_perl/5.12.2/Directory/Transactional.pm line 130.
    (in cleanup) Too many open files at /usr/local/perls/perl-5.12.2/lib/site_perl/5.12.2/Directory/Transactional.pm line 130.

У вас есть какие-либо предложения о том, как можноЯ храню свои объекты таким образом, чтобы он занимал мало места и поддерживал граф объектов?

1 Ответ

3 голосов
/ 26 октября 2010

Реализация собственного бэкэнда с использованием Data :: Serializer :

package KiokuDB::Backend::Serialize::Data::Serializer;
use Moose;
use Moose::Role;

use Data::Serializer;

use namespace::clean -except => 'meta';

with qw(
    KiokuDB::Backend::Serialize
    KiokuDB::Backend::Role::UnicodeSafe
    KiokuDB::Backend::Role::BinarySafe
);

has '_serializer' => (
    is       => 'ro',
    isa      => 'Data::Serializer',
    required => 1,
    lazy     => 1,
    default  => sub {
        Data::Serializer->new(
            serializer => 'FreezeThaw', # Storable, FreezeThaw, Data::Denter, Config::General, YAML, PHP::Serialization, XML::Dumper, and Data::Dumper
            digester   => 'MD5', # See http://search.cpan.org/~gaas/Digest-1.16/Digest.pm#Digest_speed
            compress   => 1,
            compressor => 'Compress::Zlib', # Compress::Zlib or Compress::PPMd
        );
    },
);

sub serialize {
    my ( $self, $entry ) = @_;

    return $self->_serializer->serialize($entry);
}

sub deserialize {
    my ( $self, $blob ) = @_;

    return $self->_serializer->deserialize($blob);
}

sub serialize_to_stream {
    my ( $self, $fh, $entry ) = @_;

    $self->_serializer->store( $entry, $fh );
}

sub deserialize_from_stream {
    my ( $self, $fh ) = @_;

    $self->_serializer->retrieve($fh);
}

__PACKAGE__
...