Perl的简单,现代,健壮,透明的数据结构持久性

时间:2011-02-08 08:05:24

标签: perl json frameworks persistence

我正在寻找透明地持久化Perl数据结构的解决方案(甚至不是对象,但对象支持将是一个加号),没有循环引用。我对后端并不在乎,但我更喜欢JSON。对象的数量相对较少(几千个hashrefs,每个大约有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 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

为什么不使用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 :(得分:2)

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

一些选项:

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