2010-11-16 12 views
1

Je récupère une plage de clés dans la base de données Berkeley DB en utilisant un curseur. Je fais un get en utilisant le drapeau DB_SET_RANGE suivi d'un certain nombre de obtient en utilisant le drapeau DB_NEXT.Berkeley DB: Récupérer uniquement les clés

Tout fonctionne bien. Le problème est que j'ai seulement besoin des clés pour cette opération particulière mais j'ai toujours les deux clés et les valeurs associées. Puisque les valeurs peuvent devenir assez grandes (des centaines de kilo-octets), je voudrais éviter de les récupérer. Des idées?

Répondre

1

Problème intéressant. Je ne crois pas qu'il soit possible d'obtenir les clés seules. Une approche consisterait à stocker les clés dans leur propre base de données avec zéro donnée. Si vous ne pouvez pas supporter la duplication, je pense que la meilleure approche serait de lire en bloc, puisque vous avez par définition une bonne localisation de référence pour votre gamme de valeurs. Utilisez l'indicateur DB_MULTIPLE_KEY dans votre appel DBC :: get() et un grand tampon DBT pour les données. Utilisez un DbMultipleKeyDataIterator pour itérer le bloc récupéré en bloc.

Cela devrait améliorer les choses car les éléments feuille consécutifs dans votre récupération se traduira par des copies de pages efficaces vers le tampon temporaire DBT que vous utilisez dans DBC :: get.

1

Je pense que vous pouvez utiliser la méthode DatabaseEntry.setPartial (avec un len = 0) pour indiquer au moteur BerkeleyDB chercher aucune donnée de la valeur.