2011-02-08 57 views
12

我正在尋找一個解決方案透明地堅持Perl數據結構(甚至不包括對象,但對象支持是一個加號)沒有循環引用。我不太在乎後端,但我更喜歡JSON。對象的數量會相對較低(幾千個hashref,每個約5個密鑰)。通過「透明」持久性,我的意思是我不希望每次更新內存數據結構時都必須對存儲後端提交更改。簡單,現代,強大,透明的Perl數據結構持久性

這裏的代碼如何將理想的樣子:

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以可讀格式導出它。

所以,我錯過了一個模塊,我是否正確地接近這個問題?

回答

5

要實現「透明度」目標,您必須將其抽象爲框架(如chambwez建議的)或使用tie個變量,每當它們被更新時它們將自己保存到磁盤。 DBM哈希以這種方式使用tie,因此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

+0

我正在尋找透明持久性(我希望這是正確的術語?)通過「透明」持久性,我的意思是我不希望每次更新內存時都必須提交對存儲後端的更改數據結構。我編輯了這個問題;感謝您指出了這一點。 – 2011-02-08 09:11:59

2

我不認爲透明持久性是非常好的主意。假設你有假設的實現將perl數據結構與外部世界聯繫起來。爲了透明,每一次寫入結構都必須被檢測到並且數據在外部被更新。這可能會相當昂貴,並以很多磁盤活動結束,除非您擁有快速隨機訪問的複雜後端。我無法想象JSON文件的更新效率。

一些選項:

  • 使用數據庫後端(DBM ::深,DB_File或KiokuDB)
  • 使用key-value存儲作爲後端(Memcached的,Redis的)
  • 上的數據定義一致的工作流程和序列化/反序列化