Bonjour,
Je cherche à comprendre la façon de stocker les informations en java... notamment la logique de la place mémoire.
En effet j'ai à ma disposition deux fichiers... le premier contient des informations ASCII dans un schéma particulier (MDL SDFile pour ceux qui connaissent). Le fichier fait 6 Go, les données brutes en font au moins 60%.
Le deuxième fichiers est un simple fichier CSV contentant 44 millions de lignes de deux valeurs numérique (Integer) au format ASCII séparés par un point-virgule d'une taille totale de 800Mo (une bagatelle par rapport au premier)
Dans un premier temps je parcours mon premier fichier en stockant le contenu dans un objet. Mon Objet est un simple enregistrement contenant les différents champs String et Hashmap<String, String>. Donc pas de compression à la base, je lis le fichier et je stocke ce que j'ai lu dans un objet sous forme de String.
Je m'aperçois que pour stocker le millions de valeurs du premier fichier, le chargement dans une HashMap de l'ensemble de mes objets, ou d'une List ne me prends pas plus de 100Mo (alors que je me serais attendu à beaucoup plus).
Lorsque je charge mon fichier CSV de 44 millions de lignes, ça me fait charger des chaines de caractère dans un objet (Enregistrement) ne dépassant pas les 8 caractères de long. Je m'aperçois que j'explose littéralement la JVM...
Conclusion je ne sais pas comment la jvm stocke les String... mais ce n'est clairement pas comme un fichier ASCII... de plus il apparait que la taille d'une Liste dépend plus du nombre d'enregistrement que de la taille de chaque enregistrement eux-même (au sens pris sur le fichier source).
Ma question est la suivante. Est-ce que quelqu'un sait comment sont stockées les String en mémoire sur la jvm?
J'ai remarqué que le stockage dans une HashMap prenait moins de place et moins de ressource qu'une List (en l'occurence j'ai testé sur une ArraList)
Comparaison HashMap<String, Objet> et ArrayList<Record>
où Record est un enregistrement de String et Object
Qu'en pensez vous? Quel en est la raison?
Je m'excuse si ce message n'a pas sa place ici, car je n'ai pas vraiment de problème à proprement parlé, mais je cherche réellement à comprendre comment ça se passe pour pouvoir optimiser mon code et ma logique algorithmique compte tenu du grand nombre de données manipulées.
Je vous remercie tous pour m'avoir lu jusqu'au bout et merci d'avance à ceux qui pourraient m'expliquer ce qu'ils ont compris.
Amicalement
Gojira
Partager