Quelle est l'efficacité sera d'utiliser une base de données dans la mémoire pour stocker des millions de valeurs temporaires?

StackOverflow https://stackoverflow.com/questions/3936044

Question

Mon application stocke actuellement des millions d'éléments de Double pour un calcul. Ces valeurs ne sont que des valeurs temporaires avant d'être utilisées pour un algorithme spécifique qui est exécuté à la fin du calcul. Une fois ce calcul est fait, les millions de valeurs peuvent être mis au rebut.

L'histoire est , si vous avez besoin de plus de détails.

L'une des solutions qui a été proposé est d'utiliser une base de données en mémoire.

Donc, si je vais avec cette solution, je vais utiliser cette base de données pour stocker mes valeurs dans une table pour remplacer mon Map<String, List<Double>> actuelle, comme:

create table CALCULATION_RESULTS_XXX (
  deal_id varchar2,
  values number
);

(un tableau par calcul, XXX est l'ID de calcul)

pendant le calcul, je vais faire ce qui suit:

  1. Lorsque le calcul est démarré, je crée la table CALCULATION_RESULTS_XXX.
  2. Chaque fois que je dois ajouter une valeur, j'insérer un enregistrement dans ce tableau.
  3. A la fin du calcul, j'utiliser le contenu de la table pour mon algorithme.
  4. Enfin, je laisse tomber ce tableau.

Comme expliqué dans l'autre sujet , actuellement, mon calcul peut stocker plusieurs centaines de Mo de données dans la mémoire, comme une liste de 30 * 1000000 de Double aura besoin d'environ 240Mo.

Les questions maintenant:

  1. Si je vais avec une base de données en mémoire, ce que mon consomption mémoire sera diminuée?
  2. Quels sont les points spécifiques que je dois prendre soin en ce qui concerne l'utilisation de la base de données (ou création de la table), l'insertion de données, etc.?
  3. Je pense que je vais choisir base de données H2 . Pensez-vous que c'est le meilleur choix pour mes besoins?
Était-ce utile?

La solution

Le problème est suffisamment simple que vous avez vraiment besoin juste donner un aller et voir comment les résultats (performance) élaborent.

Vous avez déjà une implémentation qui utilise de simples structures en mémoire. Personnellement, étant donné que même le moins cher ordinateur de Dell est livré avec 1 Go de RAM +, vous pourriez aussi bien en tenir à cela. Cela mis à part, il devrait être assez simple à wack dans une base de données ou deux. Je considère Sleepycat Berkerly DB (qui appartient maintenant à Oracle ...), parce que vous n'avez pas besoin d'utiliser SQL et ils devraient être tout à fait efficace. (Ils prennent en charge Java).

Si les résultats sont prometteurs, je considère ensuite une enquête plus approfondie, mais cela ne devrait vraiment prendre que quelques jours de travail, au plus, y compris l'analyse comparative.

Autres conseils

Un HashMap simple, soutenu par Terre cuite ferait mieux et permettra la collecte de stockage plus grande que la mémoire virtuelle JVM.

Bases de données embarquées, en particulier, ceux à base SQL, ajoutera la complexité et les frais généraux à votre code, donc il ne pas la peine. Si vous avez vraiment besoin d'un stockage persistant avec un accès aléatoire, essayez l'un des blocs de données NoSQL, comme CouchDB , Cassandra , Neo4j

Je ne sais pas si ce sera plus rapide, donc vous devriez essayer. Ce que je veux recommander est de faire des inserts de traitement par lots d'une liste complète lorsque vous ne pas immédiatement besoin de cette liste plus. Ne pas enregistrer les valeur par valeur:)

Si vous êtes algorithme final peut être exprimé dans SQL il pourrait aussi être utile de votre temps à le faire, et ne se charge pas toutes les listes avant. Dans tous les cas, ne pas mettre quoi que ce soit comme un indice ou une contrainte sur les valeurs , et de préférence pas non plus permettre à NULL (si possible). Le maintien des indices et des contraintes de temps des coûts et permettant NULL peut aussi coûter du temps, ou créer des frais généraux. deal_ids peuvent (et sont) de cours indexé comme ils sont les clés primaires.

Ce n'est pas beaucoup, mais au moins mieux qu'un seul bas-voté réponse:)

Il n'y a vraiment aucune raison d'ajouter un composant externe pour faire fonctionner votre programme plus lent. Comprimer le bloc de données et l'écrire dans le fichier si vous avez besoin pour gérer plus de la mémoire interne disponible. Une station de travail prend maintenant 192 Go de RAM de sorte que vous ne pouvez pas se permettre de perdre beaucoup de temps.

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