IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Stocker un objet conséquent


Sujet :

Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut Stocker un objet conséquent
    Bonjour,

    J'ai un petit ceci pour stocker un objet :

    J'essaye de faire un algo mais j'ai un problème pour stocker un objet :

    J'initialise une arrayList qui va contenir mon code de fin.

    Au début, je dois parcourir un fichier (n'importe quel fichier), puis stocker tout les caractère qui apparaisse dans ce fichier.

    J'ai stocker ces caractères dans une hashSet d'integer (j'ai caster le caractère en entier).

    Ensuite, je dois re parcourir mon fichier et cette fois à chaque fois que je lis un caractère de mon fichier je dois récupérer l'indice de ce caractère dans ma hashSet (on s'en fiche comment je la récupère).

    (C'est cette partie qui ne marche pas)
    -->
    Et cette indice, je l'ajoute à mon arrayList de départ, le problème c'est que pour les petit fichier, ça marche car il n'y à pas beaucoup d'élement à ajouter mais quand je test juste avec un film de 180mo, j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    LinkedList<Integer> linkedList = new LinkedList<Integer>(dictonnary);
     
    for (int i = 0; i < mappedByteBuffer.limit(); i++) {
    	int caracter = (int) mappedByteBuffer.get();
    	encoding.add(linkedList.indexOf(caracter));
    }
     
    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    	at java.util.Arrays.copyOf(Unknown Source)
    	at java.util.Arrays.copyOf(Unknown Source)
    	at java.util.ArrayList.grow(Unknown Source)
    	at java.util.ArrayList.ensureExplicitCapacity(Unknown Source)
    	at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    	at java.util.ArrayList.add(Unknown Source)
    	at mz78.MTF.swapAndShift(MTF.java:86)
    	at mz78.MTF.encoding(MTF.java:26)
    	at mz78.Main.main(Main.java:16)
    <--

    Que dois-je faire pour résoudre ce problème, je ne veux pas changer la taille de la jvm car si je test avec un film de 30go je ne pense pas que ça passera ^^.

    On m'a conseillé d'utiliser la sérialisation mais je n'arrive pas à faire une sérialisation avec une boucle.

    Merci.

  2. #2
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Pourquoi ne pas stocker uniquement les caractères, au moment de la lecture du fichier ? Tu lis, tu teste si c'est un caractère, si oui tu le stocke dans la structure que tu veux. Par exemple un autre fichier... Comme ça t'es sûr d'avoir assez de place, en principe, sauf si ton HD est trop plein, ce que tu peux tester avant de commencer...
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut
    Merci pour réponse tout d'abord.

    Je ne peux pas faire ça, parce que je ne l'ai pas expliquer mais je fais un traitement sur mon arrayList de départ (distonnary) quand je recherche le caractère que j'ai lu, je récupère son indice, je supprime l’élément et je le passe en tête de liste ^^. Je ne peux pas faire le traitement en même mais ce n'est pas le soucis.

    Par contre j'ai essayé de stocker ça dans un fichier mais le problème c'est que c'est super long ...

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'abord ta strutcture est mauvaise. Tu stocke tous les caractères, alors que ce qui t'intéresse, c'est le premier que tu trouve avec indexOf => t'as juste besoin d'une structure à 256 entrée qui stocke l'indice du premier caractère de chaque type. Tous les autres sont inutiles. Ensuite convertir le char en integer n'a pas de sens. Enfin, une vidéo, ce ne sont pas des caractères là dedans, donc je comprend pas trop le but de la manoeuvre....


    Enfin, encoding gagnerais à être transformée en un int[] plutôt que de bouffer plein de place en tant que List<Integer>

    Enfin, comme mentionné, il serait probablement préférable de revoir l'algo pour qu'il n'aie pas besoin de tout ce stockage, mais qu'il traite les données en flux continu.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut
    Merci, ça m'intéresse,

    Est-ce que tu pourrais me donner un exemple de ce que tu dit ?

    Au départ c'est ce que j'avais fait un tableau[255] et j'ajoutais un caractère dans ce tableau en fonction de son code ascii du coup mon tableau était triée et il n'y avait pas de doublon, sauf que dans un fichier vidéo j'ai trouvé un caractère avec un code ascii de 65500 et quelque...

    Qu'est ce que tu entend par 1er caractère de chaque type ?

    je te fais un exemple simple de l'algo si tu veux pour bien qu'on ce comprenne qu'il n'y ai pas d'ambiguité. (Avec ce que je fais actuellement).

    fichier "test.txt" contient "baaabacabacab"

    Je récupère mon dictionnaire donc je parcours mon fichier et je récupère chaque caractère.
    J'obtient : [a, b, c]

    Ensuite je re parcours mon fichier :

    Je lis un b
    donc je récupère l'indice de b dans dictionnary (1 que j'ajoute a ma structure), je le supprimer [a, c], et je le passe en tête [b, a, c].

    Je lis un a
    donc je récupère l'indice de a dans dictionnary (1 que j'ajoute a ma structure), je le supprimer [b, c], et je le passe en tête [a, b, c].

    ... Jusqu’à la fin du fichier

    A la fin j'obtient :
    [1, 1, 0, 0, 1, 1, 2, 1, 2, 1, 2, 1, 2].

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par jeyGey Voir le message
    sauf que dans un fichier vidéo j'ai trouvé un caractère avec un code ascii de 65500 et quelque...
    Un fichier vidéo c'est du binaire, pas des caractères. T'essaie de faire quoi au juste?

    Citation Envoyé par jeyGey Voir le message
    Qu'est ce que tu entend par 1er caractère de chaque type ?
    Ben l'index de la première rencontre, puisque visible c'est tout ce qu'utilise ta boucle. Quoi que vu ton exemple, tu n'utilise carrément que sa seul présence, ce qui est encore plus basique.



    Citation Envoyé par jeyGey Voir le message
    je te fais un exemple simple de l'algo si tu veux pour bien qu'on ce comprenne qu'il n'y ai pas d'ambiguité. (Avec ce que je fais actuellement).
    Je ne vois toujours pas le but de l'algo (juste ce qu'il sort), mais soit. Tu peux très bien réaliser ça avec un tableau de taille 255 comme tu l'a fait avant. Quand aux nombres que tu génère en parcourant le deuxième fichier, tu peux très bien les utiliser directement plutot que les stocker en mémoire (mais bon, j'ai pas la moindre idée de ce à quoi tu les utilise)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut
    Ok merci, je refaire la lecture et je te tiens au courant.
    Le code de fin je m'en sert dans une autre méthode et je ne peux pas le faire au fur et a mesure il me faut absolument le code de fin.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut
    En faite, sa ne m'aide pas du tout.
    Car ce que tu m'explique je l'ai deja fait (j'ai en revanche bien modifier mon code, j'ai fait un tableau de 255 case pour stocker les caractères que je trouve) mais je n'arrive pas a stocker tout les 200 000 millions de int (ou plus) que je dois stocker.

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu te rends compte que 200 000 millions de ints, ça fait à peu près 800 Giga de données?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 184
    Points : 46
    Points
    46
    Par défaut
    Je viens de refaire mon test et je fais bien 183486464 tour de boucle.
    Dans cette boucle je parcours tous les caractères de mon fichier et je dois avoir une liste de 183486464 d’élément... donc apparemment c'est impossible.

    Comment je peux faire mon traitement ? je suis obligé d'avoir cette liste pour faire mon algo ?

    Merci

  11. #11
    Membre éclairé Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536
    Points : 803
    Points
    803
    Par défaut
    Tu lis une première fois le fichier, tu fais le tableau de 256 caractères maximum. Eventuellement tu crées un fichier ne contenant que les caractères, quand tu en trouve un tu l'y met.

    Ensuite tu relis le fichier (le deuxième si tu en as fait un, sinon le premier, mais ce sera beaucoup plus long), et tu fais ta petite manip.

    En fait, autant lire le premier fichier octet par octet, non ? Pourquoi passer par des caractères ?
    Sans danger si utilisé conformément au mode d'emploi.

    (anciennement BenWillard, enfin moins anciennement que ... enfin bon c'est une longue histoire... Un genre de voyage dans le temps...)

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par jeyGey Voir le message
    je suis obligé d'avoir cette liste pour faire mon algo ?

    Merci
    En même temps, on n'a toujours pas compris le but de ton algo. Si on le connaissait, on pourrait un minimum t'aiguiller. Là on n'a que des information partielles.

  13. #13
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Citation Envoyé par jeyGey Voir le message
    Comment je peux faire mon traitement ? je suis obligé d'avoir cette liste pour faire mon algo ?
    Si j'ai bien compris ton algo, tu te retrouves avec un resultat de la meme taille que le fichier original (à supposer que tu lises des byte). Du coup, si tu veux pouvoir lire des fichiers de 30 go, il n'est pas envisageable de le faire en mémoire. Vu le comportement souhaité, il faudrait plutot utiliser un fichier en sortie comme ca, tu n'auras plus de probleme de mémoire.
    La premiere lecture permettant de récupérer les différents caracteres contenus dans le fichier ne peut remonter que 256 valeurs (si tu lis ton fichier byte par byte, ce qu'il faudrait faire). Donc ca, ca peut se faire en mémoire. Par contre, la 2e passe, non.

    Mais bon, j'ai du mal à croire qu'il y ait un intérêt à faire ce traitement (à part peut etre un cryptage basique). Il faudrait dire ce que tu veux faire plus précisement si tu veux une aide plus précise...

Discussions similaires

  1. [JTree] comment y stocker les objets ?
    Par calogerogigante dans le forum Débuter
    Réponses: 12
    Dernier message: 16/08/2008, 20h39
  2. Stocker un objet dans la session
    Par Matth_S dans le forum ASP
    Réponses: 9
    Dernier message: 20/09/2006, 11h34
  3. [Jtable] Stocker un objet
    Par nico_somb dans le forum Composants
    Réponses: 14
    Dernier message: 19/07/2006, 20h44
  4. Peut-on stocker un objet quelconque dans vector
    Par chrono23 dans le forum SL & STL
    Réponses: 30
    Dernier message: 18/06/2006, 12h54
  5. [debutant][JNI]Stocker des objet pour les rappeler plus tard
    Par Celenor dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 28/03/2004, 01h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo