【问题标题】:Simple, modern, robust, transparent persistence of data structures for PerlPerl 数据结构的简单、现代、健壮、透明的持久性
【发布时间】:2011-06-23 06:45:24
【问题描述】:

我正在寻找一种解决方案来透明地在没有循环引用的情况下持久保存 Perl 数据结构(甚至不是对象,但对象支持会是一个加分项)。我不太关心后端,但我更喜欢 JSON。对象的数量会相对较少(几千个 hashref,每个都有大约 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 以人类可读的格式导出它。

那么,我是否缺少一个模块,我是否正确地解决了这个问题?

【问题讨论】:

    标签: perl json frameworks persistence


    【解决方案1】:

    为什么不使用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】:

    我不认为透明持久性是个好主意。假设您有一个将 perl 数据结构与外部世界联系起来的假设实现。为了透明,必须检测对结构的每次写入并更新外部数据。这可能会非常昂贵并且以大量磁盘活动结束,除非您拥有具有快速随机访问的复杂后端。我无法想象 JSON 文件的更新是有效的。

    一些选项:

    • 使用数据库后端(DBM::Deep、DB_File 或 KiokuDB)
    • 使用键值存储作为后端(Memcached、Redis)
    • 定义一致的数据工作流并适时进行序列化/反序列化

    【讨论】:

      【解决方案3】:

      为了实现您的“透明度”目标,您将不得不将其抽象为一个框架(如 chambwez 建议的那样)或使用tied 变量,这些变量将在更新时将它们自己保存到磁盘中。 DBM 哈希以这种方式使用tie,因此DBM::Deep 可能是您最好的选择;我所知道的所有其他事情都需要您明确告诉它何时以性能的名义写出数据和/或缓存写入。

      【讨论】:

        猜你喜欢
        • 2010-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多