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 :

Importation de gros fichiers de données


Sujet :

MATLAB

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Importation de gros fichiers de données
    Bonjour à tous,

    Avant toute chose, je tiens à féliciter et à remercier tous les gens qui font vivre ce site. Il a régulièrement été une source d'informations précieuses au cours de mes années d'études.
    Aujourd'hui je saute le pas car je me trouve face à un problème où mes limites en ML sont atteintes.

    Très concrètement, tout est dans le titre: je souhaite importer de très gros fichiers de données dans ML (1Go<Taille<20Go). Ces fichiers contiennent xx colonnes qui elles même peuvent contenir des double ou des char.

    En ce qui concerne ma machine, Windows 7-64 bits, ML R2010b, mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Maximum possible array:              20400 MB (2.139e+010 bytes) *
    Memory available for all arrays:     20400 MB (2.139e+010 bytes) *
    Memory used by MATLAB:                 554 MB (5.810e+008 bytes)
    Physical Memory (RAM):                6007 MB (6.299e+009 bytes)
    Je pense qu'on peut dire que je suis large...

    Rq: Ce sont des CSV (qui, bien évidemment, contiennent des caractères non numériques) donc qui ne permettent pas d'utiliser csvread.

    Ma première approche, qui marchait nickel pour des fichiers de taille plus petite, consistait à charger l'intégralité du fichier par le biais de importdata puis faire mon traitement pour ne garder que ce qui m'intéresse (double ou char en fonction des colonnes).

    Quand j'arrive à des fichiers plus gros, ML refuse de les charger (le fameux "Out of Memory"). Donc je m'interroge sur la possibilité de scanner "ligne par ligne" ces fichiers afin de faire le traitement au "coup par coup" (ligne intéressante - je cast puis je stocke; ligne non pertinente - je passe à la suivante).
    Je n'arrive pas à trouver d'information intéressante à ce sujet.
    1/ Est-ce faisable?
    2/ Avez-vous d'autres idées?

    Rq: je ne peux même pas visualiser ces fichiers (ouverture en tableur impossible - il y a plus d'un Million de lignes). A terme, l'opération devra être totalement "aveugle" pour moi...

    J'espère avoir été clair et je vous remercie d'avance, toute aide me sera précieuse!

    Cdlt,

    cg

  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
    Bonsoir,

    Je ne saurais pas faire ca pour des fichiers .mat, mais si les fichiers sont des csv, tu peux toujours utiliser fopen (en matlab ou autre) et accéder linéairement au fichier.

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 157
    Points
    157
    Par défaut
    Tant que tu connais la structure de tes fichiers et que celle-ci est constante tout au long du fichier, le traitement est assez simple en effet. Il te faudra jouer avec fopen et ses fonctions associées.
    Ici tu devrais trouver ton bonheur. La fonction fread devrait faire ce que tu souhaites.

    Si tu ne connais pas la structure de ton fichier ou si celle-ci change à un moment dans le fichier, ça risque d'être un peu plus délicat.

  4. #4
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Bonjour,

    Dans ton cas, je te conseillerais d'utiliser la fonction TEXTSCAN.
    Duf
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 69
    Points
    69
    Par défaut
    Si tes fichiers font quelques Go, le traitement ligne a ligne de matlab est pas hyper rapide de mon point de vue. Surtout si tu utilise des regexp et/ou des boucle de controle pour savoir quelles lignes garder. Un simple programme PERL te permetrait d'être plus rapide (en plus c'est pas super compliqué à coder).
    C'est généralement cette option que j'utilise quand mon fichier fait plus de 3-4 Go...
    Cet avis, bien sûr n'engage, que moi.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci à tous pour vos réponses.

    Je viens de refaire un test avec un fichier de 15 Go.
    Pour reprendre vos divers éléments de réponses:
    - Duf, 'textscan' (et ce quelque soit le format demandé) renvoie un 'Out of Memory'
    - Myrne, malheureusement, la structure de mon fichier n'es pas uniforme. Certaines colonnes seront parfois vide, et il s'agit d'une information intéressante pour moi, je ne peux pas passer outre et remplir avec des zéros.
    - Buide, je prends note de ta remarque. Mais je ne connais pas du tout PERL et comme la récupération des data ne représente qu'un pourcentage très faible du travail que j'ai à accomplir, j'avoue avoir la flemme de regarder.

    J'avais initialement pensé à coupler 'fopen' avec des fonctions du type 'fgetl'. Comme tu le suggères VV33D, cela me parait être la solution qui me permettra d'avancer le plus rapidement.

    Merci pour votre aide!

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 157
    Points
    157
    Par défaut
    Un truc que tu peux faire est de récupérer la ligne sous format texte (avec fgetl de mémoire) puis l'analyser: Si c'est vide, tu ignores la ligne, si c'est rempli, tu enregistres.

    Après si tu as des lignes incomplètes que tu veux ignorer aussi, tu peux affiner le critère de sélection.

    EDIT: ça m'apprendra à ne pas lire jusqu'au bout... Vas-y, ton idée était bonne
    L'analyse de ta ligne doit pouvoir se faire avec strcmp(ligne,'string')

  8. #8
    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 dans tous les cas
    La solution final dépendra de ce que tu dois faire à la matrice finale. A partir d'une certaine taille de fichier, celle-ci ne tiendra pas non plus dans la mémoire matlab. Je vois 2 cas extrêmes:

    Soit tu fais un traitement ligne à ligne, par exemple
    * Il te suffit de voir la ligne (éventuellement quelques autres) pour savoir si tu veux la garder.
    * Tu calcule l'image de chaque vecteur ligne par une fonction
    Dans ce cas, filtre au fur et à mesure que tu importes, ou écris dans un fichier les valeurs f(ligne) au fur et à mesure.

    Soit tu as besoin de l'intégralité (somme sur chaque colonne par exemple) : il faut que tu arrive à définir et à garder en mémoire quelques variable synthétique (somme partielles, max, etc).

    Pour des très grosses tailles de fichier, il serait préférable de transformer ton csv en base de données et d'y envoyer directement une requête qui fait ce que tu veux (ce qui est faisable depuis matlab). Par contre il faudra que tu codes la requête en langage BDD

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2011
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Salut à tous,


    je reviens clore le sujet et donner la solution que j'ai fini par adopter.

    Avant toute chose, je tiens à vous remercier pour toutes vos réponses qui m'ont été bien utiles.

    Finalement, j'ai opté pour des routines en C qui me permettent de "traiter" mon fichier plat et d'en extraire les informations utiles à l'utilisateur en une vingtaine de minutes (pour 135Millions de lignes).
    Ce n'est certainement pas optimal mais cela suffit largement dans le contexte de mon projet.

    Ce pré-traitement en C est très largement inspiré de la méthode du 'fgetl' mais, au moins, j'ai la main sur la mémoire! En gros, je créé des sous-fichiers de taille raisonnable et je les importe un par un pour faire mes calculs dans ML.

    Se pose maintenant le problème de la construction du MEX qui va bien!

    Bref, je peux manipuler mes données, c'est le principal.

    Merci!

    CG

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

Discussions similaires

  1. Importation et traitement de gros fichiers de données
    Par Emeric974 dans le forum MATLAB
    Réponses: 1
    Dernier message: 04/11/2012, 20h43
  2. Importer un gros fichier SQL
    Par sami_c dans le forum ASP
    Réponses: 19
    Dernier message: 01/07/2008, 23h17
  3. Importer un gros fichier SQL sous windows
    Par bigsister dans le forum Outils
    Réponses: 2
    Dernier message: 24/08/2007, 16h17
  4. Importer un gros fichier
    Par tbassetto dans le forum Administration
    Réponses: 3
    Dernier message: 19/05/2007, 11h13
  5. Importation d'un fichier de données d'Excel
    Par mihka dans le forum MATLAB
    Réponses: 2
    Dernier message: 02/12/2006, 16h42

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