Могу ли я использовать несколько ключей в Беркли БД? - PullRequest
1 голос
/ 08 октября 2010

Я хочу использовать в 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);но есть ли другой способ?

Ответы [ 2 ]

4 голосов
/ 08 октября 2010

Berkeley-db не поддерживает несколько таких ключей. Каждая запись может иметь только один ключ.

Вы можете объединить ключи в один ключ, как вы заявили.

Вы можете использовать MLDBM , чтобы создать вид вложенных ключей. Но это работает, храня сериализованный хеш под key1, поэтому будет очень неэффективно, если у вас много ключей, вложенных в ключ верхнего уровня.

Или вы можете отказаться от BDB и использовать настоящую базу данных SQL. DBD :: SQLite прост в установке и включает ядро ​​базы данных SQLite вместе с драйвером.

Я бы выбрал сцепление ключей или реальную базу данных, в зависимости от того, что именно вы пытаетесь сделать.

0 голосов
/ 06 ноября 2013

В качестве этого условия для решения проблемы вы можете просто создать уникальный ключ, подобный этому:

$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};
        }
     }
 }
...