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は、そのような複数のキーをサポートしていません。各レコードは1つのキーのみを持つことができます。

あなたが述べたように、あなたは単一のキーを形成するためにキーを連結することができます。

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 に答える