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 :

Optimiser temps de lecture d'un fichier


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut Optimiser temps de lecture d'un fichier
    Bonjour,

    Pour analyser mes données, je dois lire des fichiers txt allant de 30 à 500 mo. Actuellement, j'utilise la fonction importdata mais parfois je peux attendre 1 à 2 minutes avant de lire et stocker les variables de mon fichier.

    Le fichier à lire contient le nom des variables dans la première ligne et dans les autres lignes on a les données. Sur chaque ligne les données sont séparées par une tabulation. Pour le moment je lis mon fichier de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    D = importdata(name,'\t',1);                        % importe le log
    Datas = D.textdata;                                 % enregistre les données au format string
    I = cellfun(@(x) isempty(x),D.textdata);            % récupère les indices des donnees au format double
    Datas(I) = num2cell(D.data);                        % concatène les données string avec les donnees double
    Ensuite pour chaque variable que je veux récupérer je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ind = find(strcmp(Datas(1,:),'Date')); 
    if (ind >= 1)
        Wind(i).Values = Datas(2:nb_lignes,ind);
        Wind(i).Name     = 'Date';
        Wind(i).Number   = 120;
        Wind(i).Unit     = 'dd/mm/yyyy';
        i = i + 1;
    end
    Ceux qui peut me faire perdre du temps est aussi que je lis tout le fichier alors que je n'exploite pas toutes les variables.

    Voilà. Si quelqu'un a une idée à proposer je suis preneur !!!

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Tu as la possibilité d'utiliser la fonction textscan. Tu peux regarder cette entrée de la FAQ.
    Dernière modification par Invité ; 01/06/2011 à 23h57.

  3. #3
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Ok. merci pour la réponse.

    Je vais regarder cette fonction et voir si elle permet d'être plus rapide.

    Sinon je crois que le mieux serait que je transforme mon log via un programme en C ou Visual Basic pour par exemple le mettre au format '*.mat'.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Je viens de tester la fonction textscan et effectivement elle est plus rapide pour la lecture. Mais je perd tout mon temps ensuite à convertir les chaine de caractère en double et je me retrouve quasiment au même temps d’exécution qu'avec ma fonction précédente.

    voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    fid = fopen(name);                                              % ouverture du fichier
    lig = fgetl(fid);                                               % lecture de la première ligne
    lig = textscan(lig,'%s','delimiter','\t');                      % Decomposition de la premiere ligne
    Data = textscan(fid,'%s','delimiter','\t');                     % lecture de tout le fichier.          
    fclose(fid);
     
    nb_colonnes = length(lig{1,1});                                 % nombre de colonne du fichier
     
    Mat_Data  = reshape(Data{1,1},nb_colonnes,[]);                  % reconstruit la matrice
    Mat_Data  = Mat_Data';                                          % transpose la matrice
    Je sauvegarde ensuite mes valeurs de la manière suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ind = find(strcmp(lig{1,1},'Tension_1'));
    if (ind >= 1)
        Wind(i).Values =  str2double(Mat_Data(:,ind));
        Wind(i).Name     = 'Tension_1';
        Wind(i).Number   = 5;
        Wind(i).Unit     = 'Voltage';
        i = i + 1;
    end
    Le souci est que mon fichier contient des chaines de caractères sur les 5 à 6 premières colonnes. Et que je ne peux donc pas tout lire en double directement. Est qu'il y aurait un moyen de définir par exemple les 5 premières colonnes je les lis en caractère et tous les autres en double ?

    Merci

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui c'est tout à fait possible, tu peux regarder l'exemple 2 de la documentation de cette fonction.

  6. #6
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    47
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 47
    Par défaut
    Merci pour cette réponse. Du coup j'ai pu optimisé le code de cette manière :

    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
    fid = fopen(name);                                              % ouverture du fichier
    lig = fgetl(fid);                                               % lecture de la première ligne
    lig = textscan(lig,'%s','delimiter','\t');                      % Decomposition de la premiere ligne
    nb_colonnes = length(lig{1,1});                                 % compte le nombre de colonne du fichier
    nb_string = 3;                                                  % Initialise le nombre de colonne de chaine de caractère en debut du fichier
    Vecteur_chaine = [];                                            
    Vecteur_double = [];
    for i=1:1:nb_string                                            % Initialise le vecteur du nombre de chaine de caractère
        Vecteur_chaine = [Vecteur_chaine '%s '];
    end                                         
    for i=nb_string+1:1:nb_colonnes                                % Initialise le vecteur du nombre de double
        Vecteur_double = [Vecteur_double '%f '];
    end                            
    Vecteur = [Vecteur_chaine Vecteur_double];                     % Conccatène les 2 vecteurs
    Data = textscan(fid,Vecteur,'delimiter','\t');                 % lecture de tout le fichier          
    fclose(fid);
    ça fait pas super propre mais je suis beaucoup plus rapide qu'avec la fonction importdata !! Maintenant si je veux aller plus vite je crois qu'il va falloir modifier la façon de logger les données, mais pour le moment je n'y ai pas accès !!

Discussions similaires

  1. Optimiser le temps de lecture d'un gros fichier
    Par wassim_boy dans le forum Entrée/Sortie
    Réponses: 20
    Dernier message: 29/12/2011, 19h37
  2. Réponses: 16
    Dernier message: 28/02/2011, 22h10
  3. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  4. [langage]Problème de temps de lecture, optimisation
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 08/01/2003, 08h47
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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