Java, Moyen recommandé de conserver les HashMaps pour un stockage permanent et fiable?


Je travaille sur un projet où beaucoup de recherches sont menées sur un très grand ensemble de données, donc je réalise que l'utilisation d'une structure de base de données traditionnelle ne fonctionne pas car j'ai besoin de lire des tables dans un format HashMap, qui reste en mémoire tout le temps, pour pouvoir exécuter des requêtes dans le temps nécessaire aux performances de l'application.

Je me demande quel est le processus recommandé pour périr un HashMap en ce qui concerne la vitesse de leur récupération à partir leur état persistant et leur souci de minimiser le code supplémentaire nécessaire (comme maintenant j'écris des classes personnalisées qui lisent les données nécessaires à partir des tables de base de données, puis créent un HashMap imbriqué reflétant la structure de données dont j'ai besoin pour être consultable le plus rapidement possible. Je ne sais pas si le simple fait d'écrire dans un fichier texte serait un bon moyen de le faire en ce qui concerne l'assurance que les données sont conservées et non corrompues. Tout conseil est apprécié

Author: Rick, 2011-03-17

3 answers

Avez-vous envisagé d'utiliser des bases de données clé-valeur (comme Redis ou Riak)?

 4
Author: wesoly, 2011-03-17 11:30:43
 2
Author: Dead Programmer, 2017-05-23 09:58:34

Si vous collez du contenu de votre base de données dans une structure de hachage afin d'accélérer les recherches sur le contenu de la base de données, je pense que vous adoptez probablement la mauvaise approche. Je ne sais pas ce que vous essayez de faire exactement, mais peut-être que l'utilisation d'un index comme Lucene est appropriée? Il s'agit d'un index mature et hautement optimisé qui gérera des choses comme la mise en cache de requêtes fréquentes en mémoire.

Alternativement, jetez un oeil à BerkeleyDB qui est essentiellement une BASE de données de hachage sauvegardée sur disque. Également très rapide. (Bien que je note que je pense qu'Oracle peut exiger une licence pour cela pour certains cas d'utilisation maintenant).

Les seules mises en garde à Lucene et BerkeleyDB sont qu'ils nécessiteront des frais généraux pour être mis en place. Donc, ma dernière suggestion est Tokyo-Cabinet qui est un hachage assez décent, très rapide et très simple à utiliser. Fondamentalement, incluez simplement le jar dans votre chemin de classe et utilisez-le comme un HashMap:

import tokyocabinet.HDB;

....

String dir = "/path/to/my/dir/";
HDB hash = new HDB();

// open the hash for read/write, create if does not exist on disk
if (!hash.open(dir + "unigrams.tch", HDB.OWRITER | HDB.OCREAT)) {
    throw new IOException("Unable to open " + dir + "unigrams.tch: " + hash.errmsg());
}

// Add something to the hash
hash.put("blah", "my string");

// Close it
hash.close();

Et c'est tout. Tout ce que vous collez dans le hachage est persisté disque, et peut être rechargé plus tard. Et ne vous inquiétez pas de la vitesse, les optimisations en mémoire sont gérées pour vous dans les coulisses.

Edit: Il semble que le cabinet de Tokyo ait été remplacé par Le Cabinet de Kyoto.

Edit 2: Vous ne dites pas quelle base de données vous utilisez, mais si MySQL la recherche en texte intégral ne fonctionne pas pour vous?

 2
Author: Richard H, 2011-03-17 15:34:14