Perl的数据结构简单、现代、强大、透明地持久化。

12
我正在寻找一个解决方案,可以透明地持久化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
为了实现你的“透明度”目标,你需要将其抽象成一个框架(如chambwez所建议的)或使用绑定变量,这些变量在更新时会保存到磁盘中。DBM哈希以这种方式使用绑定变量,因此DBM::Deep可能是最好的选择;其他我知道的都需要显式地告诉它何时写入数据和/或以性能为名缓存写入。

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


我正在寻找透明持久化(希望这是正确的术语?)所谓的“透明”持久化是指,我不想每次更新内存数据结构时都必须提交更改到存储后端。我已经编辑了问题;感谢您指出这一点。 - Dan Dascalescu

3
我不认为透明持久化是一个很好的想法。假设你有一个将Perl数据结构与外部世界联系起来的实现。为了透明,必须检测到结构中的每个写入并更新外部数据。这可能会非常昂贵,并且除非您具有带有快速随机访问的复杂后端,否则会导致大量磁盘活动。我无法想象JSON文件的更新会很高效。
一些选项:
- 使用数据库后端(DBM::Deep、DB_File或KiokuDB) - 使用键值存储作为后端(Memcached、Redis) - 对数据定义一致的工作流程,并在适当的时候进行序列化/反序列化

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接