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 :

Too Big Matrix


Sujet :

MATLAB

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Too Big Matrix
    Bonjour, j'ai un problème avec une matrice qui fait 5.10^13 éléments que Matlab ne veut pas créer (il me renvoie 'out of memory), je sais c'est beaucoup mais je ne peux pas faire autrement...
    Je travaille sur une machine toute neuve sous linux avec 12GB de ram et 4TO de mémoire.
    D'abord je n'ai pas réussi à trouver la commande memory sous linux, mais normalement vu que j'utilise Matlab 64bits sous un ubuntu 64bits je peux rentrer 2,8.10^14 éléments (cf Mathworks).
    Cependant la process limit est de 8TB et si je compte 32bits par float j'en ai pour 370TB donc je dépasse la process limit.
    J'y perds un peu mon latin...
    Si quelqu'un a une solution ou une piste sur laquelle me lancer?
    Merci d'avance

  2. #2
    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
    Tu veux manipuler une matrice d'environ 360To, ça ne me parait juste pas réalisable. Il te faudrait 360To de mémoire libre contigus pour y arriver, c'est juste in-envisageable à mes yeux.

    Tu peux toujours aller voir la FAQ voir à quoi les liens te mènent.

  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 : 52 882
    Points
    52 882
    Par défaut
    Les seules solutions envisageables qui me viennent à l’esprit sont :
    • réduction de la taille du problème
    • résolution par morceau
    • parallélisation de la résolution


    Maintenant, reste à savoir si ton problème se prête à ce genre de méthode ?

    Et si tu nous en disais un peu plus sur ton sujet d'étude et sur l'origine de cette énorme matrice ?
    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
    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!
    j'ai un problème avec une matrice qui fait 5.10^13 éléments que Matlab ne veut pas créer
    Matlab est un outil génial, mais je ne suis pas convaincu qu'il soit adapté pour un tel problème. En effet, il constitue un moyen simple et efficace pour la résolution de problèmes "normaux". En revanche, pour des problèmes "monstrueux" comme celui que tu cites, il me semble préférable d'utiliser un langage de plus bas niveau, comme le Fortran ou le C, afin d'être le plus proche possible des caractéristiques matérielles de ton ordinateur.

    je ne peux pas faire autrement...
    Alors là, j'ai des doutes! Explique-nous ton problème depuis le début: dans quel domaine travailles-tu? quelles sont les données? que cherches-tu à calculer? quelles sont les lois qui relient les données et les résultats attendus? Avec ça, on pourra essayer de t'aider.
    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)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    D'abord merci à tous pour vos réponses.
    Sinon je traite des images 3D d'IRM, qui font 256x204x134 voxels, sous forme de matrices d'autant d'éléments. Le problème est en fait un problème d'inversion de type AX=B, le but étant de trouver X sachant que A et B sont des stacks 3D de la taille citée au dessus.
    L'inversion ne peut pas se faire de façon "brutale" (genre X=B/A) parce qu'il y a une trop grande perte d'information lorsque l'on extrait B. On utilise donc une méthode (Li et Leigh 2004) où on doit créer une matrice A' de "déconvolution" qui fait (256x204x134)x(256x204x134) soit 5x10^13 éléments. On doit utiliser ensuite le lsqr (least square resolution) de matlab pour l'inversion.
    Les deux stratégies que j'ai adopté dans un premier temps sont de baisser la résolution suffisamment pour que Matlab accepte la matrice (en gros diviser par 2 dans toutes les directions ce qui fait gagner 3 ordres de grandeurs) mais les images résultantes sont presque inutilisables. Sinon j'ai choisi des régions d'intérêt faisant en quelque sorte un zoom de façon à réduire encore les tailles de matrice ce qui fonctionne très bien.
    Mais des images 3D avec plus ou moins la même résolution ont été traitées de cette façon avec plus ou moins la même machine que la mienne, alors je me demande si vous avez une idée?
    J'ai entendu parler de parallélisation de calcul sur les cartes graphiques avec le CUDA, peut être que ça pourrait m'aider?
    Sinon j'essaie de voir un code en c que je pourrais appeler de mon programme Matlab, mais c'est chaud d'apprendre une nouvelle langue!
    Voila, j'espère avoir été suffisamment clair mais c'est quand même dur à expliquer et je me casse la tête la dessus depuis 2 semaines malgré l'aide de mon prof de fac.
    Merci de votre intérêt.

  6. #6
    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!

    Deux remarques préliminaires:

    un problème d'inversion de type AX=B, le but étant de trouver X
    L'inversion de A est une mauvaise méthode pour résoudre un système linéaire. Pour plus de détails, voir mon cours "Résolution des systèmes linéaires" accessible depuis le forum algorithmique.

    mais c'est chaud d'apprendre une nouvelle langue
    Quand tu en connais 23, la 24ème, c'est assez facile.

    Revenons donc maintenant à ton problème. Tu as un tableau (et non une matrice) de 256x204x134 valeurs. Alors, indépendamment de tout ce qu'on t'a conseillé jusqu'à présent, que veux-tu obtenir à partir de ces valeurs?

    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)

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2011
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    La susceptibilité magnétique est une grandeur adimensionnée qui quantifie la magnétisation d'un corps. Lorsque que l'on expose un volume à un champ magnétique extérieur il est admis (cf équations de Maxwell) que le champ magnétique résultant (B) est égal au produit de convolution de la distribution de susceptibilité magnétique (X) avec l’interaction de dipôle unitaire (d_z).
    On a donc B=X*d_z (* étant le produit de convolution).
    Par des moyens hors du cadre du problème qui nous occupe on obtient le champ résultant (B), le but étant donc de le déconvoluer à d_z pour obtenir X. Mais ce serait trop simple, vu le caractère indéterministe de B (certaines valeurs de X ayant plusieurs images dans B par exemple). On utilise donc la méthode précitée.
    Ceci étant dit, je rappelle ma question d'origine, comment traiter un si gros tableau? et comment ça se fait que Matlab me renvoie 'out of memory' alors que je n'atteins pas le nombre maximal d'éléments permis (2,8.10^14) par ma version? et connaissez vous la commande matlab linux qui correspond à 'memory' sous windows?
    Merci.

  8. #8
    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 : 52 882
    Points
    52 882
    Par défaut
    Je suppose que tu as pris tes informations sur cette page

    Or on peut y lire :
    It assumes that [...] there is unlimited system memory (RAM plus swap file) available. These numbers will be less if there is insufficient system memory available, usually due to the swap file being too small.
    Une piste à explorer, ajoute la RAM disponible à la taille de la partition swap

    Sinon, sous Linux, les informations relatives à la mémoire se trouve dans le fichier /proc/meminfo :

    Citation Envoyé par biophysicist Voir le message
    si je compte 32bits par float j'en ai pour 370TB
    Non, tu as en pour 2 fois moins : 5*10^13*4/1024/1024/1024/1024 = 180 To (environ)

    => : Comment déterminer approximativement la quantité de mémoire nécessaire pour le stockage d'une variable ?
    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)

Discussions similaires

  1. Réponses: 2
    Dernier message: 12/06/2012, 14h15
  2. Utilisation de read.big.matrix()
    Par aïtaï_tsubasa dans le forum R
    Réponses: 7
    Dernier message: 24/03/2010, 16h42
  3. Error : number too big
    Par oesibius dans le forum Mathématiques - Sciences
    Réponses: 10
    Dernier message: 01/06/2007, 10h50
  4. [DDL] Too many versions
    Par TMuet dans le forum Débuter
    Réponses: 4
    Dernier message: 13/01/2004, 09h23
  5. Pgsql : erreur de connexion 'too many clients ...'
    Par petitmoosse dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 21/08/2003, 14h03

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