我有一个使用散列的脚本,它包含四个字符串作为其值为散列的键。这些散列还包含四个字符串作为键,它们也具有散列值。这种模式继续达到n-1级,这是在运行时确定的。散列的第n级包含整数(与通常的散列引用相对)值。Perl中的BerkeleyDB可以处理散列哈希(最多n个)的散列吗?
我安装了Perl的BerkeleyDB模块,所以我可以使用磁盘空间而不是RAM来存储这个散列。我以为,我可以简单地绑散列到一个数据库,它会工作,所以我增加了以下我的代码:
my %tags =() ;
my $file = "db_tags.db" ;
unlink $file;
tie %tags, "BerkeleyDB::Hash",
-Filename => $file,
-Flags => DB_CREATE
or die "Cannot open $file\n" ;
但是,我得到的错误:
不能用string (“HASH(0x1a69ad8)”)作为HASH ref,而在getUniqSubTreeBDB.pl第31行第1行使用“strict refs”。
为了测试,我创建了一个新脚本,散列到文件。然后我添加以下内容:
my $href = \%tags;
$tags{'C'} = {} ;
它运行良好。然后我补充说:
$tags{'C'}->{'G'} = {} ;
它会给出几乎相同的错误。我在想,BerkeleyDB无法处理我创建的数据结构类型。也许它能够在我的测试中处理第一级(C - > {}),因为它只是一个常规密钥 - >缩放器?
无论如何,任何建议或肯定我的假设将不胜感激。
s/would/should /。我没有真正测试它。 – ikegami 2012-03-21 18:07:35
我试着用$ root = tie $ tags,“DBM :: Deep”,$ dbFile替换$ root = \%标签。 程序运行速度比较慢,但它也使用内存?我认为如果你使用数据库你的RAM不会被用来存储散列? – gravitas 2012-03-22 17:04:39
@RSinghS,使用一个数据库,将避免使用内存的整点,我不明白为什么它会使用大量内存。 – ikegami 2012-03-22 17:43:16