我想在Berkeley DB中使用以下Perl逻辑(对于数百万条记录):
$hash{key1}{key2}{key3}{count1}++;
$hash{key1}{key2}{key3}{count2}++;
...
for (key1) {
for (key2) {
for (key3) {
print $hash{key1}{key2}{key3}{count1}."\t".$hash{key1}{key2}{key2}{count2};
}
}
}
多个键中的任何示例?我可能会使用“伪多重”键(key1_key2_key3);但还有其他方法吗?
答案 0 :(得分:4)
Berkeley-db不支持这样的多个键。每条记录只能有一个密钥。
如您所述,您可以将密钥连接起来形成一个密钥。
您可以使用MLDBM来显示嵌套键的外观。但这可以通过在key1
下存储序列化哈希来实现,因此如果你有很多嵌套在顶级键下的密钥,效率会非常低。
或者,您可以放弃BDB并使用真正的SQL数据库。 DBD::SQLite易于安装,包括SQLite数据库引擎及其驱动程序。
我会选择连接键或真正的数据库,具体取决于你想要做什么。
答案 1 :(得分:0)
在这种情况下,要解决问题,您只需构建一个这样的唯一键:
$seperator = "_"; #seperator depends on your data,pick one never found in your key.
$key = join $seperator , ($key1,$key2,$key3);
$hash{$key}{$count1}++;
$hash{$key}{$count2}++;
...
for (key1) {
for (key2) {
for (key3) {
$un_key = join $seperator , (key1,key2,key3);
print $hash{$un_key}{count1}."\t".$hash{$un_key}{count2};
}
}
}