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 :

Allocation d'un tableau de grande taille (1 dimension)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut Allocation d'un tableau de grande taille (1 dimension)
    Bonjour à tous

    Je veut allouer un tableau:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    printf("a*b= %d",a*b);
    int *tab;
    tab=(int*) malloc (sizeof(int)*(a*b));
    if ( tab == NULL )
    {
         fprintf(stderr,"Allocation impossible \n");
         getchar();
    }
    lorsque a*b n'est pas un grand nombre tout passe bien..
    mais dés que a*b est grand, l'allocation est impossible.. (par exemple lorsque a*b= 121601452

    Comment je peut allouer un tableau de cette taille et même plus?
    Merci d'avance

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Bonjour,
    malloc peut retourner null si le système estime ne pas pouvoir t'allouer toute cette mémoire.
    Tu as conscience d'allouer 480 Mo de ram d'un coup?

    En principe, tu n'as probablement pas besoin d'autant de ram en même temps, si tu arrives a traiter les données à la volée

  3. #3
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    malloc peut retourner null si le système estime ne pas pouvoir t'allouer toute cette mémoire.
    Donc vous pensez que ça peut être due à une insuffisance de mémoire?
    Alors, ça peut être résolu si je fait une extension de mémoire? (Je travaille sur un pc de 2 Go maintenant)

    Tu as conscience d'allouer 480 Mo de ram d'un coup?
    Oui et même plus

    La première chose à faire est s'informer auprès du système pour connaître la cause de l'échec, notamment en vérifiant errno. Remplace ton fprintf à la ligne 7 par « perror("Allocation impossible"); ».


    ça affiche: Not enough space

    Si tu travailles sous Unix
    Non je travaille sous windows 7

    Pourquoi as-tu besoin d'autant de mémoire d'un coup ?
    Je travaille avec Cplex et je traite beaucoup de données

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par mymimi Voir le message


    ça affiche: Not enough space
    « Not enough space », ça veut dire « Pas assez d'espace ». C'est assez éloquent.


    Non je travaille sous windows 7
    Dans ce cas, tu regardes la doc de malloc : http://msdn.microsoft.com/en-us/libr...=vs.80%29.aspx

    C'est un réflexe à avoir.

    Ajoute « printf ("_HEAP_MAXREQ = %llx\n",(unsigned long long int)_HEAP_MAXREQ); » dans ton programme pour voir si tu dépasses la taille admise ou pas. Cela dit, elle devrait être d'environ 4 Go, donc pas forcément la cause du problème.

    Il est possible que tu sois réellement à court de mémoire si :

    • Trop de programmes sont lancés et que ton swap est trop petit ;
    • Si tu fais d'autres malloc du même acabit ailleurs dans ton programme ;
    • Si tu fais d'autres mallocs sans les libérer. Si tu as une fuite de mémoire, il est normal que tu y arrives à court au bout d'un moment ;


    Je travaille avec Cplex et je traite beaucoup de données
    Et tu as réellement besoin d'avoir 500 mégas de données chargées simultanément dans ton programme ?

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Supposons que tu n'ais pas de fuite mémoire (je n'y crois pas… 400Mo ne doivent pas faire chuter 2Go de ram, même avec un windows…)
    La question du simultanéement est:
    "As-tu une expression arithmétique qui utilise toutes ces données?"
    Si la réponse est non, travaille par morceaux.
    Si la réponse est oui, découpe-la.
    Si c'est impossible, trouve un autre algo.
    Si c'est encore impossible, ton pc n'est pas capable de traiter ces données…

    Sauf que si tu réponds "c'est impossible" deux fois, c'est que tu devrais demander de l'aide à des spécialistes de ton domaine…

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par leternel Voir le message
    Supposons que tu n'ais pas de fuite mémoire (je n'y crois pas… 400Mo ne doivent pas faire chuter 2Go de ram, même avec un windows…)
    Même en réclamant deux gigas, ça poserait peut-être problème à l'adressage mais pas à la réservation de mémoire… sauf si :

    1) le swap est plein (ou inexistant : ça s'est vu).
    2) Il y a quelque chose d'autre qui tourne en même temps sur sa machine et qui le consomme ;
    3) il y a une fuite mémoire dans son programme. D'habitude, c'est bénin, mais si elle a une boucle qui alloue itérativement des blocs de 500 Mo à chaque tour sans les libérer, alors là, oui, on peut atteindre le fond.

  7. #7
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Mais qu'est ce qu'elle a fait cette instruction magique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("_HEAP_MAXREQ = %llx\n",(unsigned long long int)_HEAP_MAXREQ);
    le tableau est bien alloué.. et le programme est en cour d'exécution.. j'attend les résultats qu'il vas fournir..

    Pouvez -vous m'expliquer qu'est ce que c'est passé?
    Et est ce que je peut allouer d'autres tableaux plus grand juste en ajoutant cette ligne?

    Si tu fais d'autres malloc du même acabit ailleurs dans ton programme ;
    Oui j'ai déjà 2 tableau (a*b) cases, d'autres 'a' cases et d'autres 'b' cases.. a et b grands nombres!

    Si tu fais d'autres mallocs sans les libérer.
    Non je libère tout les malloc

    "As-tu une expression arithmétique qui utilise toutes ces données?"
    et
    Et tu as réellement besoin d'avoir 500 mégas de données chargées simultanément dans ton programme ?
    Oui puisque je doit les structurer dans des tableaux et les envoyer au solveur Cplex, ces tableaux doivent être structurés et connues par le solveur. Donc, à ma connaissance je ne doit pas les découper.

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    Citation Envoyé par mymimi Voir le message
    Non je travaille sous windows 7
    Il faut savoir que sous windows, chaque processus à une limite d'allocation de la mémoire (à vérifier pour window seven : de l'ordre de 1 à 2 Go).

    Les options du compilateur permettent de changer cela, mais avec une limite. En effet, ce serait une faille qu'un processus puisse allouer tout la mémoire qu'il souhaite.

    Dans ce genre de situation, on passe par un fichier.

  9. #9
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Les options du compilateur permettent de changer cela
    Si je vous ai bien compris.. je peut changer les options du compilateur pour étendre la limite d'allocation de la mémoire?

  10. #10
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Re.

    Sous Visual 2010 je n'arrive pas à retrouver l'otion dont je parlais ...

    Sinon sous VS 2010 si tu vas sur Projet->Propriétés->Editeur de liens->Système, il y a des options sur la gestion de la mémoire (activation des longues adresses par exemple). Il faut creuser de ce côté là, c'est peut-être une piste. Je commence à avoir l'impression que sous windows seven les choses ont changées.

    Dès que j'ai le temps, je teste des allocations de plus d'1 Go sur ma machine pour vérifier les limites.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonjour,

    La première chose à faire est s'informer auprès du système pour connaître la cause de l'échec, notamment en vérifiant errno. Remplace ton fprintf à la ligne 7 par « perror("Allocation impossible"); ».

    Ensuite, 121601452 entiers, si on considère qu'ils tiennent sur 32 bits, ça fait presque 464 méga-octets. Normalement, ton système doit être capable de s'en sortir avec de la mémoire virtuelle mais ça reste très élevé quand même pour un seul processus et un bloc de mémoire d'un seul tenant. Si tu travailles sous Unix, fais « ulimit -a » dans un shell pour connaître toutes les limitations imposées par défaut à ton processus.

    Pourquoi as-tu besoin d'autant de mémoire d'un coup ?

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/05/2015, 12h08
  2. tableau de grande taille
    Par kanzarih dans le forum Débuter
    Réponses: 7
    Dernier message: 03/04/2009, 22h14
  3. taille tableau trop grande
    Par zhao dans le forum C++
    Réponses: 12
    Dernier message: 26/03/2008, 15h59
  4. trie d'un tableau de grand taille
    Par kass28 dans le forum Shell et commandes GNU
    Réponses: 0
    Dernier message: 26/03/2008, 15h05
  5. [D2007, ADO, MSACCESS]Comment enregistrer un tableau grande taille ?
    Par colorid dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/07/2007, 18h39

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