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

 C++ Discussion :

Tableau trop grand pour passer dans la RAM ? Traitement de voxels


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Par défaut Tableau trop grand pour passer dans la RAM ? Traitement de voxels
    Bonjour,

    j'ai une petite question.

    j'ai une erreur lorsque je fais tourner mon programme en c++. Il s'agit de segmentatiion fault (core dumped).
    sur internet je vois que c' est quand on essaye d'acceder a un espace memoire deja alloue pour autre chose.

    mais j'ai l'impression que dans mon cas c'est plus "il n'y a plus assez de memoire"
    c'est possible ca ? parce que je vois rien a ce sujet sur internet.

    parce que quand je fais un test avec une matrice test [200][200][200] ca passe.
    mais quand je fais des test avec la matrice sur laquelle je veux travailler [220][1750][1300] ca ne passe plus.

    est-ce que ce type d'erreur vient toujours d'une mauvaise allocation memoire ou ca peut venir aussi du fait que le pc n'a pas assez de ram ?

  2. #2
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par défaut
    Oui, là c'est clairement ton OS qui dit à ton programme : holà doucement, j'ai pas tant de place disponible pour toi !

    En effet, ta matrice contient 500.500.000 cases ! supposons que tu mettes un int (soit 4 octets) dans chacune des cases, tu viens de demander 2Go de ram !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Par défaut
    merci pour la reponse.

    ba oui elle fait 4 Go la matrice il me semble (je suis en float).
    mais j'ai 16 Go de ram.

    apres j'ai cette matrice la. et la matrice calculee apres reconstruction fait 1700*1700*1300.
    j'ai les deux matrices de definies.

    mais bon je vois pas trop comment je pourrais faire autrement ... j'ai besoin de toutes les donnees de la matrice 1 pour realiser chaque voxel de la matrice 2.

    a part avoir plus de ram y a pas d'autre solution ?

  4. #4
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par défaut
    à moins de compiler en 64bits y'a pas moyen d'avoir plus de 2Go de ram pour un programme (3 en bidouillant bien windows).

    Une solution peut être d'utiliser des algorithmes qui peuvent travailler sur des parties de matrice plutôt que sur la matrice entière.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Par défaut
    je suis sous linux (soit ubuntu soit suze entreprise) depend du pc sur lequel je travaille.
    il me semblait que sous linux il n'y avait pas cette limite de 2Go.

    (je suis sous code::blocks sous linux 64 bits).

    par contre il me semble que c'est pas parce que j'ai linux en 64 bits que je compile en 64 bits c'est ca ?

    j'avais lu un truc la dessus mais je sais plus ou.

    comment je pourrais utiliser toute ma ram ?

    le probleme c'est que pour calculer le pixel [i][j][k] de la matrice 2.
    j'utilise des formules qui utilisent toutes les valeurs des pixels de la matrice 1. (a peu de chose pret). je vois pas trop comment redecouper mes matrices.
    a la limite la matrice 2 je pourrais essayer de la decouper en deux. ca serait toujours ca.
    mais dans ce cas comment je fais pour la reformer a la fin ?
    faut que je fasse une sorte de free memory de tout le reste. plus je concatene les deux et apres seulement je les sauvegardes ?

  6. #6
    Membre Expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Par défaut
    L'endroit où tu peux considérer disposer de toute la mémoire que tu veux c'est ton disque dur .

    La mémoire est construite sur ce modèle d'ailleurs :
    registres
    caches
    ram
    hdd

    le cpu va travailler avec les registres, s'il a besoin il va chercher dans le cache qui s'il a besoin va chercher dans la ram, et si besoin encore plus dans le hdd. (on peut étendre ce modèle en ajoutant des serveurs et du réseau, etc.)

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Citation Envoyé par svagrim Voir le message
    par contre il me semble que c'est pas parce que j'ai linux en 64 bits que je compile en 64 bits c'est ca ?
    Il faut utiliser une toolchain 64bits et même sur un linux 64bits tu peux avoir une version 32 bits installée

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    chaque voxel nécessite une formule à 500 millions de paramètres? ça paraît étonnant! C'est quel type de calcul? Tu ne peux pas calculer par partie?

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Par défaut
    Comment alloues-tu, pour commencer? Deux cas peuvent t'empêcher (ou te gêner fortement) d'utiliser toute ta RAM:
    1. Allocation sur la pile (valable seulement pour les petites structures) => il faut allouer sur le heap pour pouvoir utiliser toute la RAM
    2. Allocation contigüe: si tu demandes des blocs continus de 2Go ou plus, il y a de fortes chance pour que le système n'en trouve pas. Il vaut mieux utiliser des structures de données allouées par fragments dans ce cas

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Tu as vraiment besoin d'une matrice/tenseur aussi gros (bien qu'elle rentre dans ta ram) ? Tu alloues comment ta structure : statique ou dynamique ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    245
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2007
    Messages : 245
    Par défaut
    reconstruction d'imagerie haute resolution par rayon x.
    on simule le trajet que prend le rayons x depuis une source cone-beam jusqu'au voxel. en prenant en compte les probabilites que le rayon x ait pu interagir facon scattered effect dans la matiere. c' est une methode iterative. donc on fait une premiere estimation de la matiere.
    et on reevalue la quantite d'interaction qu'a pu avoir le photon en fonction de la matiere qu'il est cense avoir traversee etc ... on estime donc l'energie du spectre en fonction de la quantite de matiere traversee et du type de matiere etc pour faire une correction et passer a l'iteration suivante.

    le probleme c'est que vu les angles des faisceaux qui sont calcules dans le programme, je vois vraiment pas comment decouper ma matrice.

    pour l'initialisation de la matrice j'ai essaye un tableau en statique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float matrice2 [dimensions];
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<float> matrice2(dimensions,0);
    qui avec cette methode ca marche a peut pret jusqu'au segmentation fault en cours de route.
    la premiere methode j' ai le segmentation fault des le debut. (des l' initialisation)

    je voulais voir si je pouvais pas utiliser une matrice sparse (parce que je reconstruit un cylindre donc j'ai quelques zeros. mais je comprend pas trop comment l'utiliser ...

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/07/2009, 11h24
  2. [VBA-W2007]scinder automatiquement un tableau trop grand
    Par tazamorte dans le forum VBA Word
    Réponses: 3
    Dernier message: 22/06/2007, 17h28
  3. Réponses: 2
    Dernier message: 09/10/2006, 17h36
  4. mon arrière plan trop grand pour le bloc
    Par 123quatre dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 07/10/2006, 00h54
  5. tableau trop grand ?
    Par Praxe dans le forum C++
    Réponses: 17
    Dernier message: 17/03/2005, 14h14

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