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 :

Organiser des données (et compatibilité parfor)


Sujet :

MATLAB

  1. #1
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut Organiser des données (et compatibilité parfor)
    Bien le bonjour,

    Question assez générale que l'organisation de données ! Je voudrais connaître le point de vue de personnes plus expérimentées que moi sur le sujet. J'ai un nombre important de simulations à effectuer (à peu de choses près 13000), avec des caractéristiques différentes pour chaque simulation. Le problème c'est que j'ai plusieurs "degrés de libertés", c'est à dire que j'ai pas 13000 cas d'un seul événement, mais 40 cas, et dans ces 40 cas ensuite j'en aurais 20, et dans ces 20 après je peux en avoir de 3 à 127 cas différents... et dans chaque cas j'obtiens 4 matrices de résultats. Je pensais organiser ça sous forme de structure comme ça :

    mastructure.lelieu.lemodèle.leparamétragedumodèle.M1
    mastructure.lelieu.lemodèle.leparamétragedumodèle.M2
    mastructure.lelieu.lemodèle.leparamétragedumodèle.M3
    mastructure.lelieu.lemodèle.leparamétragedumodèle.M4

    Je me contentais de cette solution mais je n'arrive pas à l'imbriquer correctement dans une boucle parfor. Mon code synthétique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for i=1:numel(lelieu)
         load(info_sur_le_lieu)
         for j=1:numel(lemodèle)
              for k=1:numel(leparamétragedumodèle)
                   [M1 M2 M3 M4 ]=mafonction(......)
                   mastructure.lelieu.... 
              end
         end
    end
    Sauf que ça c'est, il semblerait, non compatible avec du parfor. Si je fais un parfor sur le lieu par exemple, je cache tout ce qu'il y a dans la boucle dans une fonction fonction_pour_parfor() pour "déglobaliser" les variables du load(info_sur_le_lieu) et que celles-ci soient propres à la fonction fonction_pour_parfor().

    Donc je pensais sortir une structure provisoire pour ensuite faire ma "vraie structure" comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    parfor i=1:numel(lelieu)
             [struc_temp]=fonction_pour_parfor
             mastructure.(char(fieldnames(struc_temp)))=struc_temp 
    end
    Mais y'a plein de réstriction quant à l'assignation d'un nom dynamique et l'écriture d'une structure dans une boucle parfor.

    OUF, c'était long comme explication ! Donc si vous avez des idées qui sont compatibles avec une écriture dans un parfor et qui me permettent de retrouver rapidement les données d'un lieu, d'un modèle, d'une configuration... je suis preneur !

  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
    J'ai deja été surpris par les contraintes sur parfor (ie il rale alors que mes itérations sont indépendantes). Deux solutions qui me semblent bullet-proof:
    - Tout passer en numérique dans une matrice préallouée (ou ND array)
    - Passer par des fichiers (un par itération)

    Il existe surement des solutions moins pénibles, mais dans certains cas de figures, je n'ai pas trouvé mieux.

  3. #3
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Merci VV33D ! Je suis d'accord avec ton deuxième point, si pas de solutions miracle, je vais faire un save pour chaque itération avec un joli nom et je reconstruirais tout ça proprement par la suite. Pour la première solution, ça me convient un peu moins parce que je voudrais garder la trace des spécificités de mes simulations (en plus, le nombre de sous cas dépend du cas, donc la quantité de données n'est pas régulière, plus difficile à tout agencer dans une matrice).

    Je comprends pas vraiment pourquoi le parfor me refuse l'écriture de ma structure puisqu'il ne s'agit pas d'indices ici...
    Une solution que j'utilise régulièrement pour me protéger de ce genre de problème est de cacher les opérations qui posent problème dans une fonction intermédiaire qui ne sert à rien. Et parfois, quand ça ne fonctionne pas, je rajoute un niveau et là ça marche par magie (cf ce post )
    Sauf que si je rajoute un niveau de fonction intermédiaire, dès que je rentre dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    parfor i=1:numel(lelieu)
    ...
    end
    ma variable lelieu n'est plus reconnue... -> undefined variable lelieu. Alors qu'elle existe bien pour une boucle for.

    Que passa ??

  4. #4
    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
    as-tu essayé de pré-allouer la structure ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    La préallocation ne change rien... malheureusement. J'ai donc opté pour une solution facile, c'est à dire créer un fichier pour chaque branche de la structure que je voulais enregistrer (et je les réorganise par la suite).
    Cependant, même quand je faisais ça, j'ai obtenu des erreurs. Un petit récapitulatif de ce qui fonctionne et ne fonctionne pas dans mon cas, ça pourrait peut être aider quelques personnes avec parfor :

    Note : x1 x2 et x3 sont des variables qui dans tout les cas de figure ne sont que lues et restent inchangées.

    Ce qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Global x1 x2 x3
    load('Data',x1 x2 x3)
     
    parfor i=1:size(x1,1)
    	mafonction(x1, x2, x3,...)
    end
     
    function mafonction(x1, x2, x3,...)
    	du blabla
    end
    C'est un 'pléonasme informatique', on déclare quelque chose de global pour le repasser en argument.

    Ce qui ne fonctionne pas mais qui devrait (selon moi) fonctionner

    cas 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Global x1 x2 x3
    load('Data',x1 x2 x3)
     
    parfor i=1:size(x1,1)
    	mafonction(...)*% pas besoin de passer x1 x2 et x3 puisqu'ils sont définis comme globaux*! 
    end
     
    function mafonction(...)
    	du blabla
    end
    cas 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    load('Data',x1 x2 x3)
     
    parfor i=1:size(x1,1)
    	mafonction(x1, x2, x3,...)*% je passe bien mes variables en arguments*! 
    end
     
    function mafonction(x1, x2, x3,...)
    	du blabla
    end
    Dans les deux cas qui ne fonctionnent pas, j'ai comme message d'erreur, "undifinied variable..."

  6. #6
    Candidat au Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mai 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2014
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Structure utilisée dans les parfors
    Bonjour,

    Je me retrouve à peu près dans la même situation, car je possède un structure qui comporte 50 fields qui sont à leurs tours composés de plusieurs sous structure. J'ai besoin de faire des calculs sur 1 millions de données réparties dans cette structure. Donc j'ai vite remarqué que je pouvais pas utiliser une fonction qui comporte ma structure dans mon parfor (ca serait trop facile hein). Donc j'ai pensé à deux solutions, soit je crée des variables intermédiaires dans lesquelles je place les fields dont j'ai besoin de changer les valeurs puis les rassembler pour former la structure initiale avec les données modifiées, sinon avant chaque calcul dans le programme je place un parfor (donc chaque calcul se fera sur un processeur différent) mais je pense pas que ce soit la bonne solution car le temps d'échange entre proc va être plus long que le temps gagné avec le parfor. Si vous avez besoin de plus d'info ou de la structure du programme demandez.

    Guillaume

  7. #7
    Membre confirmé
    Homme Profil pro
    Éternel universitaire
    Inscrit en
    Avril 2012
    Messages
    421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Éternel universitaire

    Informations forums :
    Inscription : Avril 2012
    Messages : 421
    Points : 639
    Points
    639
    Par défaut
    Je déterre une vieille discussion car j'ai ENFIN compris ce qu'il se passait. Nouvelle version de matlab, meilleurs rapports d'erreurs.

    L'analyse du parfor est basée sur le texte et non pas sur les variables qui sont réellement présente dans le workspace (ce qui n'est pas le cas du for visiblement). Les variables qui sont chargées avec la fonction load peuvent donc poser problème. Une petite ligne de pas grand chose pour expliciter ça dans le texte comme un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    data=load('Data',x1 x2 x3)
    ...
    parfor i=1:size(x1,1)
    	mafonction(data.x1, data.x2, data.x3,...)
    end
    ...
    et tout fonctionne pour le mieux !

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

Discussions similaires

  1. Organisation des données pour affichage.
    Par Edta dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 28/07/2009, 11h18
  2. organisation des données
    Par robindelhuxley dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/07/2008, 15h13
  3. Problème d'organisation des données dans un jeu de stratégie
    Par khayyam90 dans le forum Développement 2D, 3D et Jeux
    Réponses: 8
    Dernier message: 15/06/2007, 17h13
  4. tomcat, upload et organisation des donnèes
    Par Pikwik dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 05/09/2006, 10h59
  5. [SWT]organisation des données dans un gridlayout
    Par whilecoyote dans le forum SWT/JFace
    Réponses: 2
    Dernier message: 19/12/2005, 17h24

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