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 :

Lecture de nombreux fichiers txt


Sujet :

MATLAB

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 16
    Points
    16
    Par défaut Lecture de nombreux fichiers txt
    Bonjour à tous,

    Je cherche à créer un script optimisé pour extraire d'un fichier texte (l'extension est .wfm) un certain nombre de données.

    Pour les récupérer je lis le fichier ligne par ligne.
    Mon premier soucis est le format du fichier txt que l'on pourrait découper en 2 parties:
    L'une où je dois traiter chaque ligne de manière différente (les données extraite sont: Wafer, Date, Lot, Row_abs, Col_abs, Vsource, FieldFile, Device File, Chip File, Device Name)
    L'autre qui est une matrice (1000 lignes par 6 colonnes) et où un bon vieux strread imbriqué dans une boucle for suffit.
    L'on sélectionne à partir de cette dernière 2 colonnes qui sont stockés dans 2 variables: rouge{5} et rouge{6} de 1 ligne par 1007 colonnes.
    Ces variables correspondent au données (mesure de résistante et de champ) d'un seul fichier, que l'on va stocker dans 2 grosse variables (finalres0 et finalh) qui elles vont emmagasiner les données de 1000 fichier (= 1000 lignes par 1007 colonnes par variable).

    Tous les 1000 fichiers, finalres0 et finalh sont insérées dans une base de donnée MySQL avec la toolbox database de matlab.
    On clear les 2 variables et on recommence jusqu'à avoir traiter tous les fichiers.

    Mon second soucis est le nombre de fichier txt à lire, jusqu’à 21 100 fichiers répartie dans 25 dossiers.


    J'ai créer un script pour lire tous ces fichiers mais durant son exécution j'ai détruit la RAM du PC les hébergeant.
    Malheureusement je ne sais pas exactement ce qui est à l'origine de cette destruction, j'imagine qu'un nombre d'ouverture/fermeture de fichier à une fréquence trop rapide doit en être la cause.
    Bref je cherche à optimiser ce script pour pouvoir ouvrir ces 21 100 fichiers sans détruire le PC qui les héberge


    Voici le code utilisé
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
     
    close all;clear all;
    %% Init
    [~,directory]=uigetfile('*.wfm','WaveForm Folder','Select a wfm file');
    s=strfind(directory,'\');
    dirf=directory(1:s(end-1));
    dirlist=dir(dirf);
    sql=0;
    type='RH';
    clear s;
     
    for d=3:length(dirlist)
    dirfile=[dirf dirlist(d).name '\'];
    filelist = dir(fullfile(dirfile,'*.wfm')); %variable contenant les noms de tout les *.wfm
    validIDW=0;
    finalh=[];finalres0=[];
    for f=1:length(filelist)
    %% File opening
       valid=0;clear dday;clear ttime;clear chipF;clear devF;clear device;clear Row;clear Col;clear tline;
       clear field;clear Lot;clear wfr;clear dataB;clear wfrlist;clear lot;clear idwfm;
       clear RH;clear rouge;
       file = filelist(f).name;%on sélectionne le nom du iéme *.wfm
       fid1 = fopen(strcat(dirfile,file)); %on ouvre le fichier
     
    %% Wfm Register   
       tline = fgetl(fid1);tline = fgetl(fid1);%On parcous 2 lignes
       [~,dday]=strtok(tline);
       tline = fgetl(fid1);
       [~,ttime]=strtok(tline);
       dot=datenum([dday ' ' ttime]); %dot=DateOfTest
       tline = fgetl(fid1);tline = fgetl(fid1);%Chip File
       [~,chipF]=strtok(tline(find(isspace(tline)==1):end));
       tline = fgetl(fid1);%Device File
       [~,devF]=strtok(tline(find(isspace(tline)==1):end));
       tline = fgetl(fid1);tline = fgetl(fid1);%Device name
       [~,device]=strtok(tline);
       if find(isspace(device)==1)
           device=device(find(isspace(device)==0));
       end
       while valid==0
           tline = fgetl(fid1);
           [param,~]=strtok(tline);
           switch param
               case 'Col_abs'
                   [~,Col]=strtok(tline);[~,Col]=strtok(Col);[Col,~]=strtok(Col);Col=str2double(Col);
               case 'FieldFile'
                   [~,field]=strtok(tline);[~,field]=strtok(field);
               case 'Lot'
                   [~,Lot]=strtok(tline);[~,Lot]=strtok(Lot);[Lot,~]=strtok(Lot);
               case 'Row_abs'
                   [~,Row]=strtok(tline);[~,Row]=strtok(Row);[Row,~]=strtok(Row);Row=str2num(Row);
               case 'Wafer'
                   [~,wfr]=strtok(tline);[~,wfr]=strtok(wfr);[wfr,~]=strtok(wfr);
               case 'Vsource'
                   [~,vsource]=strtok(tline);[~,vsource]=strtok(vsource);[vsource,~]=strtok(vsource);vsource=str2num(vsource);
               case 'ShowPoints'
                  valid=1;
           end
       end   
    %% Connection SQL
    if sql==0
    conn=database('XX','xx','xx');
    if isconnection(conn)
        disp(['Connection ' XX' SQL established']);
    else
        error(['Connection ' XX' SQL failed'])
    end
     
    orig={};origr={};origh={};
    dblist=tables(conn);
    orig=cellstr(dblist(find(strcmp(dblist,'Waveform_register')==1))); %Table SQL Registre
    origr=cellstr(dblist(find(strcmp(dblist,'Waveform_res0')==1))); % Table SQL Resistance
    origh=cellstr(dblist(find(strcmp(dblist,'Waveform_hdrive')==1))); % Table SQL Field
    if isempty(orig)
        error('Waveform_register is missing')
    end
    origcol=fetch(conn,['show columns from ' orig{:}]);
    if length(origcol)~=12
    origcol=fetch(conn,['show columns from ' orig{:}]);
    end
    origcol=origcol(:,1);
    sql=1;
    end
     
       %% Index Sync = Selection d'un index dans une table SQL
    if validIDW==0
    idw=fetch(conn,['select * from Register where Register.Wafer_ID like(''W' lot '%'')']);
    validIDW=1;
    end
    %% Table_SQL: Wafeform Register
    final=[];
    final{end+1,1}=Lot;
    final{end,2}=wfr;
    final{end,3}=idw{find(strcmp(idw,wfr)==1),2};
    final{end,5}=dot;
    final{end,6}=Row;
    final{end,7}=Col;
    final{end,8}=device;
    final{end,9}=type;
    final{end,10}=chipF;
    final{end,11}=devF;
    final{end,12}=field;
    final{end,13}=vsource;
     
     
    fastinsert(conn,orig{:},origcol,final); %insert final dans SQL_table: Wafeform Register
     
    %% Table_SQL res 0 & hdrive
    idwfm=fetch(conn,['select idwfm from Waveform_register where idw=' num2str(final{end,3}) ' and Datetime=''' datestr(dot,'yyyy-mm-dd HH:MM:SS') ''''...
                       ' and Row=' num2str(Row) ' and Col=' num2str(Col) ' and Device=''' device ''' and Kind_of_test=''' type '''']); % selection d'un index correspondant au fichier en cours de traitement.
     
    disp(['Waveform_register is updated for idwfm=' num2str(idwfm{:})]);               
    valid=0;clear final;
       while valid==0 
           tline = fgetl(fid1); %On descent jusqu'à la 83éme ligne du fichier wfm
            if strfind(tline,'LongReport')>=0
                  tline = fgetl(fid1);
                  tline = fgetl(fid1);
                  tline = fgetl(fid1);
                  tline = fgetl(fid1);
               for i=1:1000
                    tline = fgetl(fid1);
                    RH{i}=strread(tline,'%s','delimiter','\t'); %On transfère tous les points dans un Tableau de cell
               end
               valid=1;
            end
       end
       fc=-1;
       while fc==-1
       fc=fclose(fid1);
       end
        finalres0{end+1,1}=idw{find(strcmp(idw,wfr)==1),2};
        finalres0{end,2}=idwfm{:};
        finalres0{end,3}=wfr;
        finalres0{end,4}=dot;
        finalres0{end,5}=Row;
        finalres0{end,6}=Col;
        finalres0{end,7}=device;
     
        finalh{end+1,1}=idw{find(strcmp(idw,wfr)==1),2};
        finalh{end,2}=idwfm{:};
        finalh{end,3}=wfr;
        finalh{end,4}=dot;
        finalh{end,5}=Row;
        finalh{end,6}=Col;
        finalh{end,7}=device;
     
       for i=1:1000 %Mise en forme des données présente dans la variable RH
            rouge = RH{i};
            finalres0{end,(i+7)} = str2double(rouge{6}); %on enregistre les valeurs de res0
            finalh{end,(i+7)}=str2double(rouge{5}); %on enregistre les valeurs de hdrive
       end
       clear RH;clear rouge;
        if size(finalh,1)==1000 || f==length(filelist)
    %% Column name
        origcolr=fetch(conn,['show columns from ' origr{:}]);    
        origcolr=origcolr(:,1); %Nom des colonnes de la table Waveform_res0
        origcolh=fetch(conn,['show columns from ' origh{:}]);    
        origcolh=origcolh(:,1); %Nom des colonnes de la table Waveform_hdrive
        %%
        fastinsert(conn,origr{:},origcolr,finalres0); %insert final dans SQL_table: Waveform_res0
        disp(['Waveform_res0 is updated for idwfm=' num2str(idwfm{:})]);   
        clear finalres0;pause(0.5);  
        fastinsert(conn,origh{:},origcolh,finalh); %insert final dans SQL_table: Waveform_hdrive
        clear finalh;pause(0.5);   
        disp(['Waveform_hdrive is updated for idwfm=' num2str(idwfm{:})]);   
        clear finalh;clear finalres0;clear origcolh;clear origcolr;
        finalh=[];finalres0=[];
        end
    end
    clear filelist;
    end
    close(conn);
    Et voici un exempe de fichier .wfm type
    Wxx_Lxx.rar

    Si vous avez des pistes à m'indiquez, je vous en serez reconnaissant.

    Merci d'avoir lu ce post et n'hésitez pas à poser des questions si quelque chose vous parait flou.

    Cdlt,
    Ogrius

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur en calculs scientifiques
    Inscrit en
    Août 2007
    Messages
    4 639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur en calculs scientifiques

    Informations forums :
    Inscription : Août 2007
    Messages : 4 639
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    c'est la première fois que j'entends que matlab pourrait détruire de la RAM physiquement! Est-ce que tu n'as pas eu plutôt un simple "out of memory"? Peux-tu préciser ce point?
    Et est-ce que tu as besoin d'ouvrir les 21000 fichiers simultanément?
    Pour une bonne utilisation des balises code c'est ici!
    Petit guide du voyageur MATLABien : Le forum La faq Les tutoriels Les sources


    La nature est un livre écrit en langage mathématique. Galilée.

  3. #3
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    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 302
    Points : 53 166
    Points
    53 166
    Par défaut
    Es-tu sûr que c'est bien la partie lecture de données qui sature la RAM ? Ne serait-ce pas plutôt l'interfaçage avec la base de données ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    Merci d'avoir lu le post,

    _Tout d'abord je m'excuse mais j'ai fait une petite erreur dans mon post concernant la matrice de la 2ème partie du fichier.

    Pour rappel, dans la 2ème partie du fichier txt l'on extrait deux matrices (rouge{5} et rouge{6}) de 1 ligne par 1007 colonnes chacune.
    Ces deux matrices sont à leur tour stockée dans 2 plus grosses matrices (finalh et finalres0) qui vont contenir les données de 1000 fichiers txt (on aura donc des matrices de 1000 lignes par 1007 colonnes).
    C'est ces 2 grosses matrices que l'on insère dans la base de données.

    _A propos de vos questions:

    Magelan: La première version du script créer des out of memory dû à la quantité de données chargé (provenant d'un fichier).
    Dans cette version, j'ai inséré des clears dès que je le pouvais afin de libéré le maximum de mémoire.
    Il est à noter que le script ouvre un fichier txt, en extrait les données, ferme le fichier puis les insère dans la database avant de passer au suivant.

    Magela et Dut:
    Un petit détail que j'ai omis de préciser: Le script est exécuté depuis mon pc, il ouvre les fichiers txt qui sont hébergé sur un autre PC en réseau puis insère les données dans la database hébergé sur le serveur du réseau.
    On va donc ouvrir les données à un endroit pour les insérée dans un autre.

    J'ignore complètement ce qui a pu provoquer la destruction de la RAM, il est possible que ce soit la fonction (fastinsert) qui insère les données dans la database.
    Je vais cependant ajouter un commentaire: Dans un autre script qui exploite un gros fichiers texte, j'insère des matrices de 1000 lignes par 33 colonnes sans aucun soucis.
    Dans notre script, l'on fait 4 insert de données dont 2 sont les matrices finalH et finalres0 de 1000 lignes par 1007 colonnes.
    Peut être que la fonction fastinsert gère mal ce nombre élevé de colonnes mais elle utilise des variables du workspace gérer par RAM de mon PC (non?).
    Quel serait alors le lien entre la RAM du PC où sont hébergé les fichiers txt et la fonction fastinsert ?

    Merci d'avance pour votre aide.

  5. #5
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Citation Envoyé par magelan Voir le message
    c'est la première fois que j'entends que matlab pourrait détruire de la RAM physiquement!
    matlab est un langage très puissant !

    Citation Envoyé par ogrius Voir le message
    J'ignore complètement ce qui a pu provoquer la destruction de la RAM,
    l'age, probablement

    plus sérieusement matlab a un problème dans la gestion de la mémoire, une petite recherche sur le forum et tu devrais trouver plusieurs post qui en traitent
    que faire ?
    - programmer en optimisant la RAM (pré allocation, découpage des gros tableau, éviter de dupliquer des données, utilisation de nested function ...)
    - passer en 64 bits (et éventuellement ajouter de la RAM)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Bonjour lefab,

    Pour info: Mon PC est en 64bit et possède 4Go de RAM.
    Cependant ce n'est pas la RAM de mon PC qui a rendu l'âme, c'est celle d'un autre PC (où été hébergée les fichiers txt) qui en possédait 64Go (le PC est une station de calcul) et j'avoue ne pas comprendre pourquoi.

  7. #7
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    je doute sérieusement qu'on puisse flinguer de la ram comme ca
    plutot avec le temps des secteurs de la ram deviennent défectueux ... jusqu'au jour ou la part défectueuse devient importante et le système la considère comme morte
    il y a des outils de diagnostique / réparation de la ram

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 16
    Points
    16
    Par défaut
    Lefab,
    Le PC a été amener à une entreprise spécialisé pour diagnostique + changement de RAM, et elle n'a pu fournir aucune explication autre qu'un RAM détruite et inexploitable.


    L'objet de ce post était de soumettre le script à des membres plus expérimentés que moi afin de voir s'ils trouvaient une énorme erreur qui expliquerai une usure rapide 1 (ou destruction) de la RAM.

    Si vous avez des commentaires sur le script, je vous en serez reconnaissant.

    Merci.

Discussions similaires

  1. lecture d'un fichier txt ligne par ligne
    Par SoBaKa dans le forum Général Python
    Réponses: 4
    Dernier message: 06/03/2007, 12h02
  2. Lecture depuis un fichiers txt
    Par mask91 dans le forum C++
    Réponses: 15
    Dernier message: 04/03/2007, 22h40
  3. Réponses: 4
    Dernier message: 13/11/2006, 22h30
  4. Lecture et ecriture fichier txt
    Par jeanmy dans le forum Delphi
    Réponses: 12
    Dernier message: 07/08/2006, 17h23
  5. [debutant] lecture d'un fichier txt de 10mo
    Par karamazov994 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 19/04/2005, 15h55

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