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 :

Lire fichier texte volumineux


Sujet :

MATLAB

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 42
    Points
    42
    Par défaut Lire fichier texte volumineux
    Bonjour a tous,

    Je suis nouveau ici donc je vous remercie de m'accueillir sur le forum !

    Voila mon problème :
    Je cherche a lire de très gros fichiers texte (plus de 500 Mo) contenant des données a traiter dans Matlab. Ce sont en fait de grosses matrices. Étant donne que les fichiers sont très gros, j'ai essaye de fonctionner en lisant des portions de fichier afin d’éviter les problèmes de limites mémoire.

    J'ai utilise dans un premier temps la fonction fscanf qui permet de lire depuis un pointeur sur le fichier. La fonction est assez rapide mais des que si je veux sélectionner le milieu ou la fin du fichier, j'ai très souvent une erreur de dépassement mémoire. Le problème vient du fait qu'il faut sauvegarder une grosse matrice et en sélectionner une portion.

    J'ai donc ensuite essaye d’utiliser la fonction fgetl. Cette fonction lit les lignes du fichier une par une. Dans ce cas il n'y a pas de problème mémoire car je peux lui dire de sauvegarder seulement les lignes qui m’intéressent, mais par contre le temps de lecture est très très long... Parfois plus d'une demie-heure !

    J'aimerais donc trouver une façon rapide pour lire des portions de fichiers texte. C'est la première fois que je suis confronte a ce problème sous Matlab car avant je lisais des fichiers de petites taille et qui ne nécessitait pas ce genre d'attention ! Si quelqu'un a des idées ou connait une fonction qui fait ce boulot...

    Merci d'avance,

    A bientôt

  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,

    est-ce que ton fichier contient une ou plusieurs matrices? contient-il du texte en dehors des valeurs numériques? En gros comment sont organisées les données à l'intérieur de ces fichiers?
    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
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    Merci pour ta réponse.

    En fait mon fichier contient un en-tête de 19 lignes avec du texte et des valeurs. Il n'y a pas de problème de ce cote car j'arrive a lire ce que je veux et a déplacer le pointeur de position dans le fichier a la fin de l’en-tête.

    Le fichier est ensuite compose d'une seule matrice. Chaque valeur a 4 chiffres après la virgule et pour chaque ligne, les valeurs sont séparées par une tabulation. Voici un exemple :

    'en-tete'
    0.2348 1.4760 -2.5390 -22.8760
    1.2345 3.4444 9.9999 3.5811
    -1.3250 4.0000 5.9870 3.5666
    etc.

    En général les matrices ont plus de 3000 colonnes et plus de 20000 lignes... L’idéal pour moi serait de pouvoir sélectionner les lignes que je veux (par exemple lignes de 101 a 200). Chaque ligne est en fait un vecteur temporel et correspond a une position spatiale.

    J'ai tente d'utiliser fseek afin de déplacer le pointeur de position ou je veux mais étant donne que l’unité est l'octet, les lignes ne font pas la même taille et ce n'est pas possible... Ou alors je m'y prend mal.

    J'ai également essaye textscan mais le formatage ne semble pas approprie a mon cas.

    Merci pour votre aide.

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 42
    Points
    42
    Par défaut
    Je pense qu'une solution possible serait de déplacer le pointeur de position ligne par ligne dans le fichier et de sauvegarder la ou les lignes qui m’intéressent...

    fgetl permet de le faire mais au prix d'un temps de calcul très long... Quelqu'un connaitrait-il un moyen de faire cela sans utiliser fgetl ?

    Merci

  5. #5
    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 163
    Points
    53 163
    Par défaut
    Comme tu l'as souligné, le problème avec la plupart des fichiers text est que la longueur des lignes n'est pas constante (nombre de caractères différent d'une ligne à l'autre).

    Il est donc impossible de se rendre automatiquement à une ligne donnée sans examiner les lignes précédentes.

    Tu peux ouvrir le fichier en mode binaire, lire itérativement avec FREAD une certaine quantité de données par paquets (buffer), et compter le nombre de retour à la ligne jusqu'à atteindre la ligne souhaitée.

    Les caractères de retour à la ligne et leurs équivalents numériques sont (si je ne me trompe pas) :
    • Windows : \r\n soit [13 10]
    • Linux : \n soit 10
    • Mac : \r soit 13


    Tu peux peut être aussi essayer la fonction TEXTSCAN de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    H = 19;
     
    s = 101;
    e = 200;
     
    fid = fopen('data.txt');
       X = textscan(fid,'%f%f%f%f',e-s+1,'headerlines',H+s-1,'collectoutput',true);
    fclose(fid);
    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)

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 42
    Points
    42
    Par défaut
    Merci DUT pour ta réponse.

    Je vois bien le fonctionnement que ça pourrait donner avec fread mais est-ce que au final ce serait plus rapide qu'avec fgetl ?

    Grâce a ton exemple, tu m'as fait remarquer que le paramètre 'headerlines' pourrait en fait me servir a sauter les lignes du début et je pense avoir trouve une solution qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        delimString = [];
        for it = 1  : Nt,
            delimString = strcat( delimString, '%f ', ' ' );
        end
     
        startLine = 101;
        endLine = 200;
     
        Y = cell2mat(textscan( fid, delimString, endLine-startLine+1, 'headerlines', startLine-1, 'delimiter', ' ', 'MultipleDelimsAsOne', 1 ))';
    En prenant le fid après la lecture de l’en-tête.

    En tout cas, ça a l'air de bien fonctionner avec mes fichiers et c'est (beaucoup) plus rapide qu'avec fscanf ou fgetl ! Une succession de %f ou %*f dans delimString me permettra de sélectionner les colonnes désirées.

    Merci et a bientot !

  7. #7
    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 163
    Points
    53 163
    Par défaut
    Citation Envoyé par mcewen Voir le message
    Je vois bien le fonctionnement que ça pourrait donner avec fread mais est-ce que au final ce serait plus rapide qu'avec fgetl ?
    Je pense que oui.

    Sinon le code que tu as posté précédemment devrait se simplifier en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        delimString = repmat('%f', 1, Nt); 
     
        startLine = 101;
        endLine = 200;
     
        Y = textscan( fid, delimString, endLine-startLine+1, 'headerlines', startLine-1, 'MultipleDelimsAsOne', 1, 'collectoutput',true );
    A tester...
    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)

  8. #8
    Rédacteur

    Homme Profil pro
    Comme retraité, des masses
    Inscrit en
    Avril 2007
    Messages
    2 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : Suisse

    Informations professionnelles :
    Activité : Comme retraité, des masses
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 2 978
    Points : 5 179
    Points
    5 179
    Par défaut
    Salut!
    Quand on maîtrise 23 langages de programmation, il est très simple d'en apprendre un 24ème. Cette petite remarque préalable pour te dire que je me demande s'il ne serait pas préférable d'utiliser plutôt le C ou le Fortran.
    Jean-Marc Blanc
    Calcul numérique de processus industriels
    Formation, conseil, développement

    Point n'est besoin d'espérer pour entreprendre, ni de réussir pour persévérer. (Guillaume le Taiseux)

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 42
    Points
    42
    Par défaut
    Merci Dut pour les simplifications. Je vais tester ca.

    Quand on maîtrise 23 langages de programmation, il est très simple d'en apprendre un 24ème. Cette petite remarque préalable pour te dire que je me demande s'il ne serait pas préférable d'utiliser plutôt le C ou le Fortran.
    Je sais en effet qu'il serait plus facile de le faire avec ces langages mais les traitements que j'applique a ces données sont codes en Matlab uniquement.

  10. #10
    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 163
    Points
    53 163
    Par défaut
    Citation Envoyé par mcewen Voir le message
    Je sais en effet qu'il serait plus facile de le faire avec ces langages mais les traitements que j'applique a ces données sont codes en Matlab uniquement.
    En coupant la poire en deux, je dirais que le langage Perl pourrait être un bon compromis car il est à la fois dédié au traitement de fichier texte (du moins initialement) et il est directement interprétable par MATLAB (via la fonction PERL)
    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)

  11. #11
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 36
    Points : 42
    Points
    42
    Par défaut
    Ah c'est intéressant ça ! A creuser quand j'aurai du temps. Merci Dut !

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

Discussions similaires

  1. Lire fichier texte
    Par kinouseb dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 08/11/2006, 17h01
  2. [Fichier Textes]Scruter fichier texte volumineux
    Par hawax dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 18/10/2006, 18h53
  3. Lire fichier texte en respectant la police, la forme
    Par loupin dans le forum Langage
    Réponses: 2
    Dernier message: 10/07/2006, 22h49
  4. Lire fichier Texte
    Par rprom1 dans le forum Entrée/Sortie
    Réponses: 12
    Dernier message: 15/03/2006, 16h36
  5. Recherche dans un fichier texte volumineux.
    Par Actarus69 dans le forum VB 6 et antérieur
    Réponses: 17
    Dernier message: 27/07/2005, 17h39

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