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

Langage Java Discussion :

memoire et chaine de caracteres


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut memoire et chaine de caracteres
    Bonsoir,
    j ai un programme qui me permet de consulter une base de donnees dans laquelle j ai stocke un ensemble d informations, parmi eux un champ de type String. voici un bout de mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(condition){
    //instructions
    ResultSet s;//contient  les champs de ma table de ma BD
    String chaine=s.getString("nom_chmps");
    //instructions
    le probleme c que l affectation de cette chaine de caracteres (nommer chaine), sature la memoire du PC.
    svp est ce que vous pouvez m aider.
    Merci.

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu lis combien d'enregistrements dans ta boucle et quelle taille a le champ ?

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Ta boucle est infinie, donc tu mets une infinité de String...

    Il faut faire un next() à chaque tour de boucle sur ton ResultSet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(s.next()) {
        String chaine = s.getString("mon_chmps");
        ...
    }

  4. #4
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par ®om
    Ta boucle est infinie, donc tu mets une infinité de String...

    Il faut faire un next() à chaque tour de boucle sur ton ResultSet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(s.next()) {
        String chaine = s.getString("mon_chmps");
        ...
    }
    Je dirais même plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (s.next()) {
        String chaine = s.getString("mon_chmps");
        ...
    }

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par thibaut
    Je dirais même plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (s.next()) {
        String chaine = s.getString("mon_chmps");
        ...
    }
    Ouais, effectivement.
    Mais dans ce cas il ne faut pas le mettre dans while(condition)...

  6. #6
    Membre émérite
    Profil pro
    Architecte technique
    Inscrit en
    Mars 2002
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Mars 2002
    Messages : 966
    Par défaut
    Citation Envoyé par ®om
    Ouais, effectivement.
    Mais dans ce cas il ne faut pas le mettre dans while(condition)...
    Oui c'est ce que je sous-entendais: remplacer le while(condition) par un while(s.next()).

    A+

  7. #7
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 128
    Par défaut code source
    while(terme.next()){
    scoreContenu=0;
    scoreStructure=0;
    score=0;



    path=terme.getString("path");


    String ref_elm=terme.getString("ref_elm");
    String parent=terme.getString("parent");
    //System.out.println(scoreStructure);

    int ref_doc=terme.getInt("ref_doc");
    String c="select * from document where ref_doc="+ref_doc;
    ResultSet c1=getConnection().createStatement().executeQuery(c);
    c1.next();

    StringBuffer chemin=new StringBuffer();
    chemin.append(c1.getString("chemin").substring(20,c1.getString("chemin").length()-4));


    StringBuffer terme_element=new StringBuffer();
    terme_element.append(terme.getString("terme"));
    StringTokenizer st1=new StringTokenizer(terme_element.toString(),";\n");
    while(st1.hasMoreTokens()){
    String p1=st1.nextToken();

    StringTokenizer st2=new StringTokenizer(p1,",");
    String p2=null;
    if(st2.hasMoreTokens())
    p2=st2.nextToken();//mot



    if(mot_uni.contains(p2)){
    String p3=null;String p4=null;
    float frq=0;double distance=1;
    float frq_ter=frequenceTerme(mot,p2);
    if(st2.hasMoreTokens()){
    p3=st2.nextToken();//frq
    frq=Float.parseFloat(p3);
    }
    if(st2.hasMoreTokens()){
    p4=st2.nextToken();//distance
    distance=Float.parseFloat(p4);
    }
    //System.out.println(p2+" "+p3+" "+p4);
    path=terme.getString("path");
    int nb_uni=terme.getInt("nb_uni");
    int nb_tot=terme.getInt("nb_tot");
    //int ref_doc1=terme.getInt("ref_doc");



    if(p2!=null&&p3!=null&&p4!=null)
    scoreContenu+=(frq/distance)*(((float)nb_uni)/((float)nb_tot))*Math.log(((float)(nb_doc_col))/Float.parseFloat(v_dt.elementAt(mot_uni.indexOf(p2)).toString()))*frq_ter;

    //System.out.println("mo= "+p2);
    //System.out.println("frq "+frq+"distance= "+distance+",nb_uni "+nb_uni+", nb_tot "+nb_tot+" vdt= "+v_dt.elementAt(mot_uni.indexOf(p2)).toString()+"col= "+nb_doc_col+"freqterm= "+frq_ter+" scoreContenu="+scoreContenu);

    }//fin if
    }//fin st1
    //System.out.println("sc con= "+scoreContenu);
    //System.out.println("sc struc= "+scoreStructure);

    score=alpha*scoreContenu+(1-alpha)*scoreStructure;



    //traitement contenu
    if(score>max){
    max=score;
    }

    if(score!=0&&v_sc.size()<1500){//System.out.println(scoreStructure);
    v_sc.add(score);//System.out.println(v_sc.size.elementAt(0).toString());
    v_path.add(path);
    v_fichier.add(ref_doc);
    }//fin if
    else if(score!=0&&v_sc.size()>=1500){

    if(score>min(v_sc)){
    v_sc.setElementAt(String.valueOf(score),indice);
    v_path.setElementAt(path,indice);
    v_fichier.setElementAt(ref_doc,indice);
    }
    }//fin else if

    System.out.println("memoire= "+Runtime.getRuntime().freeMemory());
    ref=terme.getRow();

    }//fin while


    la partie en italique dans le code c elle qui sature la memoire

  8. #8
    Membre Expert
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Par défaut
    Ca pique vraiment les yeux !!!
    Ne pas oublier :
    - d'utiliser les balises CODE
    - de respecter les règles de nommage Java !!!!!!!!!!!!!!!!!!!

    Bon, sinon je pense que oui c'est normal que ça sature.
    Tu ne fermes pas ton ResultSet c1 ni le Statement sur lequel tu l'ouvres... Ce n'est à mon avis pas la String qui te mange la mémoire mais ça...

    Accessoirement, tu aurais certainement pu inclure la table ref_doc dans la première requête avec une jointure non ? (à moins que ce soit une base séparée).

Discussions similaires

  1. Liberation memoire chaine de caractere
    Par BatuBou dans le forum C
    Réponses: 12
    Dernier message: 12/01/2008, 04h52
  2. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  3. chaine de caracteres et memoire partagée
    Par iznogoud36 dans le forum C
    Réponses: 22
    Dernier message: 20/02/2007, 14h12
  4. Réponses: 44
    Dernier message: 18/05/2006, 16h19
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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