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

MATLAB Discussion :

[strrep] out of memory


Sujet :

MATLAB

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 358
    Points : 106
    Points
    106
    Par défaut [strrep] out of memory
    Bonjour :

    Voici mon problème:je lis un fichier txt comprenant des chiffres , des lettres ainsi que des valeurs NoRX. Je souhaite lire l'ensemble de mon fichier txt et dès que je vois un NoRX le transformer en 0.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     % changement NoRX en 0.00
            fid = fopen(Nom_Fichier,'r');
            X = fread(fid);
            fclose(fid);
     
            X =strrep(X,'NoRX','0.00 ');
     
            fid = fopen(Nom_Fichier,'w');
            fwrite(fid,X);
            fclose(fid);
    voici le message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Error using ==> strrep
    Out of memory. 
     
    Error in ==> convertisseur at 101
            X =strrep(X,'NoRX','0.00 ');
     
    ??? Error while evaluating uicontrol Callback
    JE ne vois pas ou est l'erreur? est ce le fais que mon fichier txt est trop volumineux et donc ma variable X n'est pas assez grande

  2. #2
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    mon fichier txt est trop volumineux
    -> oui, (mais cela n'a rien a voir avec la taille de la variable X).

    Si ton fichier contient plusieurs lignes, fais ta procédure ligne à ligne (+eventuellement écris chaque ligne transformée dans un nouveau fichier plutot que de toutes les conserver).

    Sinon, essaye de splitter ta chaine en plusieurs sous chaines, en etant sur que tu n'a pas coupé au milieu d'un NoRX.

  3. #3
    Débutant
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 358
    Points : 106
    Points
    106
    Par défaut
    Pour faire ligne par ligne , je ne vois pas comment mi prendre , j'ai écris cela
    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
     C_Wintax=importdata(fullfile(pathname, filename),' ',1)
            [m,n]=size(C_Wintax.textdata)
            fid=fopen(fullfile(pathname, filename),'wt');
     
            for i=2:m 
                for j=1:n
                    bool=strcmp(C_Wintax.textdata{i,j},'NoRX');
                    if (bool==1)
                        C_Wintax.textdata{i,j}='0.00';  
                    end
                    A=C_Wintax.textdata{i,j};
                       fprintf(fid,'%f\t',A);
                       fprintf(fid,'\n');
                end
            end
      fclose(fid);
    Mais cela ne me ré écrit pas mon fichier correctement

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Essaie cette alternative au code donné dans ton premier message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
            fid = fopen(Nom_Fichier,'r');
            X = fread(fid);
            fclose(fid);
     
            idx = strfind(X,'NoRX');
     
            for n = 1:numel(idx)
                X(idx(n):idx(n)+3) = '0.00';
            end
     
            fid = fopen(Nom_Fichier,'w');
            fwrite(fid,X);
            fclose(fid);
    ou sans la boucle FOR-END :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            fid = fopen(Nom_Fichier,'r');
            X = fread(fid);
            fclose(fid);
     
            idx = strfind(X,'NoRX');
     
            X(idx) = '0';
            X(idx+1) = '.';
            X(idx+2) = '0';
            X(idx+3) = '0';
     
            fid = fopen(Nom_Fichier,'w');
            fwrite(fid,X);
            fclose(fid);

  5. #5
    Débutant
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 358
    Points : 106
    Points
    106
    Par défaut
    Voici le message d'erreur , que me renvoie matlab avec le code précédent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Error using ==> strfind
    Input strings must have one row.
     
    Error in ==> test>charger_wintax at 98
            idx = strfind(X,'NoRX');
     
    ??? Error while evaluating uicontrol Callback
    Pourtant X comprend normalement plusieur colonne

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Effectivement, je n'avais pas testé la solution avant de la donnée.

    Il faut modifier la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X = fread(fid,[1,inf]);

  7. #7
    Débutant
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 358
    Points : 106
    Points
    106
    Par défaut
    Cela fonctionne effctivement sur un fichier précis , mais des que je veux prendre un fichier un peu plus conséquent , j'obtient apres compilation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ??? Error using ==> fread
    Out of memory. Type HELP MEMORY for your options.
     
    Error in ==> test>charger_wintax at 95
          X = fread(fid,[1,inf]);
     
    ??? Error while evaluating uicontrol Callback
    Toujours ce problème de mémoire , qui je pense viens de mon pc

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Deux idées de lecture par morceaux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    bufsize = 4000;
     
    fid = fopen(Nom_Fichier,'r+');
     
    while ~feof(fid)
        X = fread(fid,bufsize);
        X = strrep(X,'NoRX','0.00');
        fseek(fid,-bufsize,'cof');
        fwrite(fid,X);
    end
     
    fclose(fid);
    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
    bufsize = 4000;
     
    fid = fopen(Nom_Fichier,'r+');
     
    while ~feof(fid)
        X = fread(fid,[1,bufsize]);
        idx = strfind(X,'NoRX');
        if ~isempty(idx)
            X(idx) = '0';
            X(idx+1) = '.';
            X(idx+2) = '0';
            X(idx+3) = '0';
            fseek(fid,-bufsize,'cof');
            fwrite(fid,X);
        end
    end
     
    fclose(fid);
    La taille de la variable bufsize devra être ajustée pour obtenir des performances optimales.

    Je n'ai pas testé les codes ci-dessus mais c'est l'idée qui compte

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Citation Envoyé par Dut Voir le message
    Je n'ai pas testé les codes ci-dessus mais c'est l'idée qui compte
    En fait , le code n'est pas très robuste.

    Si par malchance, la taille du buffer "coupe" le fichier au milieu de l'emplacement du mot recherché, ce dernier ne sera pas remplacé.

    Il faut donc plutôt faire :
    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
    w{1} = 'NoRX';
    w{2} = '0.00';
    
    bufsize = 4000;
    
    fid = fopen(Nom_Fichier, 'r+');
    
    while ~feof(fid)
        X = fread(fid, bufsize);
        X = strrep(X, w{1}, w{2});
        fseek(fid, -bufsize, 'cof');
        fwrite(fid, X);
        fseek(fid, -numel(w{1}), 'cof');
    end
    
    fclose(fid);
    L'idée consiste à décaler la reprise de la lecture vers le début du fichier de la taille du mot à remplacer.

  10. #10
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Dut Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while ~feof(fid)
        X = fread(fid, bufsize);
        X = strrep(X, w{1}, w{2});
        fseek(fid, -bufsize, 'cof');
        fwrite(fid, X);
        fseek(fid, -numel(w{1}), 'cof');
    end
    Ici le test de fin de fichier est mal placé vu que l'on revient en arrière juste avant, ce qui nous fait une boucle infinie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while 1
        X = fread(fid, bufsize);
        X = strrep(X, w{1}, w{2});
        if feof(fid)
            fseek(fid, -numel(X), 'cof');
            fwrite(fid, X);
            break
        end
        fseek(fid, -bufsize, 'cof');
        fwrite(fid, X);
        fseek(fid, -numel(w{1}), 'cof');
    end

  11. #11
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 316
    Points : 52 951
    Points
    52 951
    Par défaut
    Citation Envoyé par Winjerome Voir le message
    Ici le test de fin de fichier est mal placé vu que l'on revient en arrière juste avant, ce qui nous fait une boucle infinie
    Bien vu

  12. #12
    Débutant
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    358
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 358
    Points : 106
    Points
    106
    Par défaut
    parfait merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XStream][String]out of memory
    Par Invité dans le forum Persistance des données
    Réponses: 8
    Dernier message: 10/01/2006, 14h52
  2. [C++] [gcc] out of memory
    Par fxp17 dans le forum GCC
    Réponses: 5
    Dernier message: 06/01/2006, 10h29
  3. [pb mémoire] out of memory d'eclipse
    Par Casp dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/05/2005, 16h39
  4. Out of memory
    Par shurato dans le forum ANT
    Réponses: 1
    Dernier message: 10/11/2004, 16h19
  5. [JBuilder 8] Out of memory problem ...
    Par keros dans le forum JBuilder
    Réponses: 2
    Dernier message: 08/09/2003, 19h03

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