Question

J'ai besoin d'une structure de carte soutenue par disque à utiliser dans une application Java. Il doit avoir les critères suivants:

  1. Capable de stocker des millions de dossiers (voire des milliards)
  2. Fast Lookup - La majorité des opérations sur la carte seront simplement pour voir si une clé existe déjà. Ceci, et 1 ci-dessus sont les critères les plus importants. Il devrait y avoir un mécanisme de mise en cache de mémoire efficace pour les clés fréquemment utilisées.
  3. Persistent, mais n'a pas besoin d'être transactionnel, peut vivre avec un certain échec. c'est-à-dire heureux de se synchroniser avec disque périodiquement et n'a pas besoin d'être transactionnel.
  4. Capable de stocker des types primitifs simples - mais je n'ai pas besoin de stocker des objets sérialisés.
  5. Il n'a pas besoin d'être distribué, IE s'exécutera tout sur une seule machine.
  6. Simple à configurer et libre à utiliser.
  7. Aucune requête relationnelle requise

Les clés d'enregistrement seront des chaînes ou des longs. Comme décrit ci-dessus, les lectures seront beaucoup plus fréquentes que les écritures, et la majorité des lectures seront simplement pour vérifier si une clé existe (c'est-à-dire que les données associées aux clés). Chaque enregistrement sera mis à jour une seule fois et les enregistrements ne sont pas supprimés.

J'utilise actuellement BDB JE mais je cherche d'autres options.


Mise à jour

Ont depuis amélioré les performances de requête sur ma configuration BDB existante en réduisant la dépendance aux clés secondaires. Certaines requêtes ont nécessité une jointure sur deux clés secondaires et en les combinant dans une clé composite, j'ai supprimé un niveau d'indirection dans la recherche qui accélère bien les choses.

Était-ce utile?

La solution

J'utiliserais probablement une base de données locale. Comme dire BDB JE ou HSQLDB. Puis-je demander ce qui ne va pas avec cette approche? Vous devez avoir une raison de rechercher des alternatives.

En réponse aux commentaires: Comme les performances du problème et je suppose que vous utilisez déjà JDBC pour gérer cela, cela pourrait valoir la peine d'essayer HSQLB et de lire le chapitre sur Mémoire et utilisation du disque.

Autres conseils

Jdbm3 fait exactement ce que vous recherchez. Il s'agit d'une bibliothèque de cartes soutenues par disque avec une API vraiment simple et des performances élevées.

METTRE À JOUR

Ce projet a maintenant évolué en mapdb http://www.mapdb.org

Vous voudrez peut-être examiner Orientdb.

Vous pouvez essayer Java Chronicles de http://openhft.net/products/chronicle-map/Chronicle MAP est un magasin de données persistant de haute performance, de valeur clé et de valeur clé. Cela fonctionne comme une carte Java standard

À partir d'aujourd'hui, j'utiliserais soit Mapdb (synchronisation basée sur des fichiers / sauvegarde ou async) ou Noisette. Plus tard, vous devrez implémenter votre propre persistance, c'est-à-dire soutenu par un SGBDR en implémentant une interface Java. Openhft Chronicle pourrait être une autre option. Je ne sais pas comment la persistance fonctionne là-bas car je ne l'ai jamais utilisée, mais la prétention d'en avoir une. OpenHFT est complètement hors tas et permet des mises à jour partielles d'objets (des primitives) sans (dé-) sérialisation, qui pourrait être un avantage de performance.

Remarque: Si vous avez besoin de votre disque de carte basé en raison des problèmes de mémoire, l'option la plus simple est MAPDB. Hazelcast pourrait être utilisé comme un cache (distribué ou non), ce qui vous permet d'expulser des éléments de tas après le temps ou la taille. OpenHFT est hors tas et pourrait être pris en compte si vous n'avez besoin que de persistance pour les redémarrages JVM.

J'ai trouvé Armoire à Tokyo être un simple hachage / carte persistant, et rapide à configurer et à utiliser.

Cet exemple abrégé, tiré de les documents, montre à quel point il est simple d'enregistrer et de récupérer des données à partir d'une carte persistante:

    // create the object
    HDB hdb = new HDB();
    // open the database
    hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
    // add item 
    hdb.put("foo", "hop");
    hdb.close();

Sqlite fait cela. J'ai écrit un wrapper pour l'utiliser de Java: http://zentus.com/sqlitejdbc

Comme je l'ai mentionné dans un commentaire, j'ai utilisé avec succès SQLite avec des gigaoctets de données et des tableaux de centaines de millions de lignes. Si vous réfléchissez correctement à l'indexation, c'est très rapide.

La seule douleur est l'interface JDBC. Comparé à un simple hashmap, il est maladroit. Je finis souvent par écrire un JDBC-Wrapper pour le projet spécifique, qui peut s'ajouter à beaucoup de code de passe-partout.

Cache Jboss (arbre) est une excellente option. Vous pouvez l'utiliser autonome de JBoss. Très robuste, performant et flexible.

je pense Éclats d'hibernate peut facilement répondre à toutes vos exigences.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top