1

我想在 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);但还有其他方法吗?

4

2 回答 2

4

Berkeley-db 不支持这样的多个键。每条记录只能有一个键。

如您所述,您可以连接这些键以形成一个键。

您可以使用MLDBM给出嵌套键的外观。但这通过在 下存储序列化哈希来工作key1,因此如果您有很多嵌套在顶级键下的键,它将非常低效。

或者,您可以放弃 BDB 并使用真正的 SQL 数据库。 DBD::SQLite易于安装,包括SQLite数据库引擎及其驱动程序。

我会选择连接键或真正的数据库,这取决于你到底想要做什么。

于 2010-10-07T22:17:23.173 回答
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};
        }
     }
 }
于 2013-11-06T07:14:26.953 回答