2011-02-08 24 views
12

Tôi đang tìm một giải pháp để minh bạch tồn tại cấu trúc dữ liệu Perl (không phải đối tượng, nhưng hỗ trợ đối tượng sẽ là dấu cộng) mà không có tham chiếu vòng tròn. Tôi không quan tâm nhiều đến backend, nhưng tôi thích JSON hơn. Số lượng đối tượng sẽ tương đối thấp (một vài nghìn hashrefs với khoảng 5 khóa mỗi đối tượng). Bởi sự kiên trì "minh bạch" tôi có nghĩa là tôi không muốn phải thực hiện các thay đổi đối với backend lưu trữ mỗi khi tôi cập nhật cấu trúc dữ liệu trong bộ nhớ.Đơn giản, hiện đại, mạnh mẽ, minh bạch, bền vững của các kết cấu dữ liệu cho Perl

Dưới đây là cách mã sẽ lý tưởng như sau:

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 

Cho đến nay tôi đã xem xét: Perl Object-Oriented Persistence lập module

Tôi đã chỉ tìm thấy một mô-đun đầy hứa hẹn, DBM::Deep. Mã này giống như trong ví dụ và bạn có thể tải cấu trúc dữ liệu với

my $ds = DBM::Deep->new("myfile.db"); 

Định dạng là nhị phân. Không phải là một vấn đề lớn, vì tôi có thể sử dụng JSON để xuất nó theo định dạng có thể đọc được.

Vì vậy, tôi thiếu mô-đun và tôi có đang tiếp cận vấn đề một cách chính xác không?

Trả lời

5

Để đạt được mục tiêu "minh bạch", bạn sẽ phải trừu tượng hóa nó thành một khung (như chambwez gợi ý) hoặc sử dụng tie biến d sẽ tự lưu vào đĩa bất cứ khi nào chúng được cập nhật. Băm DBM sử dụng tie theo cách này, vì vậy DBM::Deep có lẽ là đặt cược tốt nhất của bạn; mọi thứ khác mà tôi biết là yêu cầu bạn nói rõ ràng khi nào ghi dữ liệu ra và/hoặc cache ghi vào tên hiệu suất.

3

Tại sao không sử dụng JSON? Đó là khá dễ dàng (trừ khi tôi hiểu lầm câu hỏi của bạn), tất cả các bạn sẽ làm được điều này:

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; 

Một điều dễ dàng, bạn có thể làm là sử dụng Data::Dumper.

+0

Tôi đang tìm sự kiên trì trong suốt (Tôi hy vọng đây là thuật ngữ chính xác?) Bằng sự kiên trì "trong suốt" nghĩa là tôi không muốn thực hiện các thay đổi đối với phụ trợ lưu trữ mỗi khi tôi cập nhật bộ nhớ trong cấu trúc dữ liệu. Tôi đã chỉnh sửa câu hỏi; cảm ơn vì đã chỉ ra điều này. –

2

Tôi không nghĩ rằng sự kiên trì trong suốt là ý tưởng rất hay. Giả sử bạn có triển khai giả định rằng gắn kết cấu trúc dữ liệu perl với thế giới bên ngoài. Để được minh bạch, mỗi viết vào cấu trúc phải được phát hiện và dữ liệu bên ngoài được cập nhật.Điều này có thể sẽ khá tốn kém và kết thúc với rất nhiều hoạt động đĩa trừ khi bạn có phần phụ trợ tinh vi với truy cập ngẫu nhiên nhanh. Tôi không thể tưởng tượng các bản cập nhật của tệp JSON có hiệu quả.

Một số tùy chọn:

  • sử dụng cơ sở dữ liệu backend (DBM :: sâu, DB_File hoặc KiokuDB)
  • cửa hàng
  • sử dụng chìa khóa-giá trị như backend (Memcached, Redis)
  • xác định công việc phù hợp trên dữ liệu và serialize/deserialize trong khoảnh khắc tốt
Các vấn đề liên quan