2011-04-26 3 views
2

Je travaille sur un projet qui utilise la chaîne personnalisée < String, l'entrée > (où Entry est une paire d'ints) implémentation basée sur B-tree pour stocker de 10 à 100 des millions d'enregistrements, le code de cette classe est lent et sale. J'ai besoin d'une implémentation efficace de la carte, qui utilise un fichier pour le stockage et une petite quantité de mémoire.Implémentation de java.util.Map basée sur des fichiers existants

J'ai recherché et trouvé que Java Edition de Berkeley DB a java.util.Collection API (y compris Map), mais il semble superflu d'utiliser une base de données à part entière (il utilise le répertoire avec beaucoup de fichiers, a plusieurs threads pour la gestion). Y a-t-il une solution plus simple?

Répondre

1

Jetez un coup d'œil à Kyoto Cabininet, une implémentation DBM sauvegardée sur disque. J'ai utilisé la version précédente, Tokyo Cabinet - il était mort facile à utiliser, fondamentalement juste comme un natif Map, et très rapide.

+0

C'est bien, mais ne fournit pas d'interface java.util.Map (j'ai beaucoup de code qui suppose que l'interface de la carte). – Ivan

+0

Cela devrait prendre quelques minutes pour créer un wrapper 'Map' personnalisé pour un objet de base de données Kyoto Cabinet. –

1

JDBM est une implémentation Java B-Tree légère et pure.

2

J'ai eu ce même problème récemment et j'ai regardé tout sous le soleil, y compris NoSQL et les caches. Vous voulez un hashmap disque/fichier/supporté. Berkeley DB Java Edition est de loin le meilleur. C'est rapide, évolutif et complet, mais vous ne pouvez pas le distribuer aux clients sans distribuer votre code source ou acheter la version commerciale d'Oracle.

Le seul autre choix, en plus de réinventer la roue, est JDBM2. Il a également une hashmap et une carte d'arbre. Vous êtes responsable de rincer régulièrement sur disque pour éviter OutOfMemoryError et il n'est pas aussi rapide que Berkeley DB mais c'est un très bon second choix.

Questions connexes