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

Collection et Stream Java Discussion :

Creation d un tableau de type connu a l instanciation


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Par défaut Creation d un tableau de type connu a l instanciation
    Bonjour,

    J ai un probleme de genericite que je n arrive pas a resoudre.
    J ai dans un fichier des donnees (de type non connu). Je veux copier ces donnees dans un tableau. Je teste donc le type de donnee :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public Class getType(Variable var) { // var est l object de la variable dont les donnees sont dans le fichier
            try {
                for (String data : getAllData(var)) {
                    Integer.parseInt(data);
                }
                return Integer.class;
            } catch (NumberFormatException ex) {
            }
     
            try {
                for (String data : getAllData(var)) {
                    Float.parseFloat(data);
                }
                return Float.class;
            } catch (NumberFormatException ex) {
            }
     
            try {
                for (String data : getAllData(var)) {
                    Double.parseDouble(data);
                }
                return Double.class;
            } catch (NumberFormatException ex) {
            }
     
            return String.class;
        }
    Comment alors creer un tableau de ce type:
    ArrayList<quoi mettre ici> array = newArrayList<quoi mettre ici>();

    Je peux bien sur faire un tableau ArrayList<?> array = newArrayList<?>(); mais j aurai aime preciser le type car j ai besoin de le connaitre plus tard.

    Pour le moment j ai une variable ou lutilisateur dit si c est numerique (que je met alors double pour etre sur) ou text (String).

    Merci pour vos reponses

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Par défaut
    Je viens de tomber sur un article parlant de "reflexion". Ca a l air de faire ce que je veux, mais ca a la ir aussi bien complique (en tout cas sur le site de Sun)

    Est ce la solution a adopter pour moi? Et si oui, ets il possible d avoir un example?

    Merci

  3. #3
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Il n'est pas possible de renseigner, par la reflexivité, le quoi mettre ici.

    Ce quoi mettre ici est forcément du niveau déclaratif, c'est à dire placé quelque part dans le source pour préciser les variables que tu utilises.

    La difficulté est que tu explores, au runtime, un ensemble de données, que tu en déduis leur type est que tu voudrais fabriquer leur classe générique, tout cela au runtime. Tel que ce n'est pas possible, ou super-tiré par les cheveux.

    Moi je pense qu'il vaut mieux :
    - pour la phase de génération au runtime, oublier les génériques, ne procéder qu'avec des ArrayList simples, des casts, instanceof et autres.
    - pour les portions de code spécifique à un générique donné, que tu connais donc précisément lorsque tu écris ton code, tu passes en générique ; et tu fais l'interface entre les deux à l'aide de méthodes bien précises protégées par des @SuppressWarnings("unchecked") : ceci me semble justifié, puisque tu passes consciemment d'un monde à l'autre.

    Hugh.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Par défaut
    Merci pour ta reponse,
    Je suis pas sur d avoir bien tout compris ta solution cependant

    Pour savoir si ca correspond a la solution dont tu parles, je vais expliquer ce que j ai fait:

    Je dois donc charger des fichiers csv avec des informations dedans, dont je ne connais pas le type a prioris. Pour le moment, l utilisateur renseigne si la variable (une colonne dans le csv) est numerique ou text.

    J ai donc un generic "Variable" (abstract) et 2 sous types "VariableNumeric<T extends Number>" et "VariableText". Je construis pour le moment mon "VariableNumeric" comme "VariableNumeric<Double>" pour etre sur d avoir une presision assez bonne pour couvrir la majorite des types de donnees numerique possible (souvent c est des Integer ou des nombres aves quelques chiffres apres la virgules).
    Je copie donc les donnees de ces variables dans 1ere base de donnee virtuelle (des ArrayList<String>), et ensuite dans une seconde base de donnees virtuelle (basiquement une structure a base de Map et ArrayList) pour un acces plus rapide ensuite. Je ne me sers apres plus de la 1ere base (Elle est seulement gardee tout ou en partie par la JVM car elle ne recopie pas vraiment les donnees de la 1ere base dans la 2e, mais fait seulement des liens)
    Tout ceci marche tres bien.

    Mon probleme est que mon programme utilise BEAUCOUP de memoire des que les fichiers de donnees deviennent un peu grand, et j arrive vite a un "OUt of Memory" (meme avec l option -Xmx).
    Pour exemple, avec un fichier de 25Mo environ, j ai besoin de 500Mo de Ram. Je voudrais donc optimiser l espace memoire en allouant pas a chaque fois un Double pour tout type numerique, mais par exemple un Integer si la donnee en est un. Cela pourrait me faire gagner pas mal de place.

    1) Merci de m avoir lu jusque ici.
    2) Je crois donc rentrer dans la description que tu as donne, a moins que je n ai pas bien compris...
    Si c est deja ce que je fais, comment optimiser l espace memoire de mon programme? (simplement une idee, car je sais que que ce n est pas forcement evident sans le code, mais il est tres long...)

    Merci encore

  5. #5
    Membre Expert
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Par défaut
    Citation Envoyé par Malawi Voir le message
    Pour exemple, avec un fichier de 25Mo environ, j ai besoin de 500Mo de Ram. Je voudrais donc optimiser l espace memoire en allouant pas a chaque fois un Double pour tout type numerique, mais par exemple un Integer si la donnee en est un. Cela pourrait me faire gagner pas mal de place.
    Selon tes explications, je ne vois rien qui explique un pareil quota ! Quasi 20 fois la place pour une donnée d'origine, même pour java cela fait beaucoup !

    Je te suggère premièrement de rechercher d'où sort ce besoin de mémoire.

    Pour répondre à ton problème, si je résume d'abord : il me semble que tu souhaites un type générique de famille numérique de façon à optimiser l'espace mémoire.

    Au départ c'est dans un fichier csv, puis à la suite de x manipulations, tu voudrais un VariableNumeric<Double>, ou VariableNumeric<Integer>, ou n'importe quoi d'autre.

    Mais après, nous dérivons vers un problème de mémoire ?...

    Enfin bref, au niveau des génériques, il faut bien comprendre que c'est uniquement une forme d'écriture, forme qui exprime une certaine logique.

    Il ne s'agit pas de nouvelles classes. Il faut bien faire la différence entre par exemple, ton VariableNumeric<Double>, et une classe qui s'appellerait VariableNumericDouble.

    La première est une classe VariableNumeric, que quelque chose d'extérieur déclare se rapporter à un Double, mais dont rien du fonctionnement interne concerne Double, tandis que la deuxième est une variable qui se comporte spécifiquement selon les propriétés d'un Double, que l'extérieur le veuille ou pas, l'extérieur pouvant même l'ignorer.

    (en supposant bien sûr que Double veuille dire ce à quoi tout le monde s'attend ! )

    Donc tu choisiras VariableNumeric<TrucMuche> si tu veux stipuler qu'un usage donné de VariableNumeric concerne un TrucMuche, mais c'est seulement une facilité d'écriture à usage extérieur.

    Tu choisiras VariableNumericTrucMuche si tu veux dire que VariableNumericTrucMuche existe par lui même.

    J'ai l'impression que plus j'explique, plus c'est confus...

    Bon, j'en rajoute une couche.

    La difficulté pour comprendre vient sans doute du nom : VariableNumeric<Double> ; VariableNumeric tend à dire que nous sommes en présence d'un numérique, qui se comporte donc comme un numérique, tandis que <Double> tends à dire notre classe se rapporte à un Double, mais sans se comporter comme un Double.

    Nous avons donc quelque chose qui se comporte comme un numérique, mais sans être un double. Pas forcément facile à séparer les concepts...

    C'est clair, non ?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 53
    Par défaut
    Merci encore pour ta reponse, et merci d y passer tant de temps,

    J avais compris le principe que tu mas explique, la n est pas le pb. J ai pas du etre tres clair dans le message precedent.
    Mon probleme initial est bien un probleme de memoire. Je regarde depuis plusieurs jours avec un profiler et tout me parait venir de ces recopies de donnees que je fait.

    Laissons tomber le pb des VariableNumeric, ca n a fait que embrouiller la chose!


    En gros, avec un exemple simple qui donne une idee de mon pb:
    - j ai des donnees dans un fichier csv :
    - pour chaque variable (colonne du fichier), je lis les donnees une par une: "String value"
    - je met les donnees de chaque variable dans une premiere base de donnee (un ArrayList<String> par variable)
    - je mets cette donnee dans l ArrayList correspondant
    - je fais des traitements
    - je transforme la base de donnees 1 en base de donnees 2 pour une lecture plus rapide:
    Cette base est une TreeMap<Double, HashMap<Object, ArrayList<Object>>>, que j appelle une TreeMultiHashMap<Double, Object, Object>. Les "Object" sont les valeurs de mon fichier (donc numerique ou String). J utilise pour cela le MultiHashMap de Apache.
    Ainsi pour chaque variable, je rajoute ses donnees selon le type de la variable:
    - numerique : base2.put( key1, key2, Double.parseDouble( value ))
    - text : base2.put( key1, key2, value )
    - je fais d autres traitements


    Quand je fais un profiler, j ai donc majoritairement en memoire (ordre decroissant):

    - des char, qui proviennent de la lecture du fichier lors de la copie en base 1
    (j imagine qu ils sont gardes en memoire par la JVM et que des liens sont faits de "base" vers "String" vers "char", char etant de type primitif)
    - des Object[], qui proviennent de la creation de la base 2
    - des String, qui proviennent de la lecture du fichier lors de la copie en base 1
    puis en moindre mesure:
    - HashMap$Entry, pour la base
    - ArrayList, pour la base
    - Double, representant les valeurs numerique de mon fichier
    - le reste, qui n est pas significatif


    Et je ne vois pas comment reduire la memoire utilisee...
    En esperant avoir ete clair cette fois...

Discussions similaires

  1. [Tableaux] Création dynamique de tableau type array()
    Par Pahcixam dans le forum Langage
    Réponses: 7
    Dernier message: 29/11/2006, 14h34
  2. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58
  3. Réponses: 1
    Dernier message: 30/01/2005, 11h00
  4. [Debutant]reallocation de memoire d'un tableau de type perso
    Par killerjeff dans le forum Débuter
    Réponses: 3
    Dernier message: 04/08/2004, 17h09
  5. [VB.NET] Création d'un tableau en code behind
    Par netr dans le forum ASP.NET
    Réponses: 6
    Dernier message: 11/05/2004, 10h02

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