2

Mon application doit utiliser des données dans un fichier texte d'une taille maximale de 5 Go. Je ne peux pas charger toutes ces données dans la mémoire vive car il est beaucoup trop grand.Comment gérer des données volumineuses en Java?

Les données sont stockées comme une table, 5 millions d'enregistrements (lignes) et 40 colonnes contenant chacune du texte qui sera converti en mémoire en chaîne, en ints ou en double.

J'ai essayé de mettre en cache seulement 10 - 100 Mo de données en mémoire et de recharger à partir du fichier quand j'ai besoin de données à l'extérieur mais c'est beaucoup trop lent! Quand je cours des calculs parce que je peux sauter au hasard de n'importe quelle rangée dans la table il devrait constamment ouvrir le dossier, lire et fermer.

J'ai besoin de quelque chose rapidement, je pensais utiliser une sorte de DB. Je sais que les calculs avec de grandes données comme celle-ci peuvent prendre un certain temps, ce qui est bien. Si j'utilise une base de données, elle doit être configurée au lancement de l'application de bureau et ne nécessite pas l'installation préalable d'un composant de serveur.

Des conseils? Merci

+1

Vous devez utiliser SQLite. – SLaks

+0

Les enregistrements ont-ils une taille fixe? Un système de base de données externe est-il une solution acceptable? – Joni

+0

Pas une taille fixe, peut changer à tout moment je charge un fichier différent. – user2704766

Répondre

2

Je pense que vous avez besoin de clarifier certaines choses:

  • C'est une application de bureau (je suppose que oui), quelle est la limite de mémoire pour elle?
  • Utilisez-vous votre fichier en mode lecture seule?
  • Quel genre de calculs essayez-vous de faire? (La fréquence des lignes sont accessibles au hasard, comment lisent souvent des lignes conséquentes, avez-vous besoin de modifier les données)

Actuellement, je vois deux façons pour une enquête plus approfondie:

  • Utilisez SQLite. C'est une petite base de données à un seul fichier, orientée principalement pour les applications de bureau et l'utilisation mono-utilisateur. Il ne nécessite aucun serveur, tout ce dont vous avez besoin est d'avoir une bibliothèque jdbc appropriée.
  • Créer une sorte d'index, en utilisant, par exemple, l'arbre binaire. La première fois que vous lisez votre fichier, indexez la position de début des lignes dans le fichier. En conjonction avec ouvert en permanence random access file cela vous aidera à rechercher et à lire la rangée rapidement désirée. Pour l'arbre binaire, votre index peut être d'environ 120M. (c'est RowsCount * 2 * IndexValueSize pour l'arbre binaire)
+0

Salut, merci pour la réponse. Oui c'est une application de bureau, la limite de mémoire est d'environ 2 Go. Le fichier est en lecture seule Les calculs sont effectués lorsqu'un utilisateur les demande, quand il choisit de le faire, le thread calc s'exécute et parcourt chaque élément de données (Cellule dans la table chargée depuis le fichier) jusqu'à ce qu'il soit terminé. Cela étant dit, il existe une autre fonction de calcul dans laquelle il est possible d'accéder de manière aléatoire à quelques milliers de lignes. – user2704766

+0

Création de table DB "à la volée" à partir de votre fichier sera opération plutôt lourde. Si vous pouvez changer la façon dont les données sont stockées, je vous recommande de remplacer complètement la "table dans le fichier" par la table dans un DB léger (disons, SQLite). – Aivean

+0

Vous pouvez également envisager de créer des pré-calculs. Je ne sais pas quels sont les calculs exacts que vous faites, mais essayez de penser si vous pouvez agréger vos données d'une manière ou d'une autre afin qu'elles puissent tenir dans la mémoire. Mais de toute façon, l'utilisation d'une base de données légère pour le stockage de données semble être la solution la moins chère et la plus rapide. – Aivean

2

Vous pouvez utiliser une base de données intégrée, vous pouvez trouver une comparaison ici: Java Embedded Databases Comparison. Ou, en fonction de votre cas d'utilisation, vous pouvez même essayer d'utiliser Lucene qui est un moteur de recherche en texte intégral.

+0

Merci, je vais jeter un oeil à H2. Des inconvénients sur SQlite? – user2704766

+0

@ user2704766 aucune idée, juste un autre lien;) http://database-management-systems.findthebest.com/compare/16-53/H2-vs-SQLite – Katona

Questions connexes