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

  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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    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 ?

  4. #4
    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

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    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 ?

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

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    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.

  8. #8
    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.

  9. #9
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    Par défaut
    Citation Envoyé par mymimi Voir le message
    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);
    Elle ne fait rien du tout : elle écrit simplement à l'écran la valeur de _HEAP_MAXREQ, laquelle est la taille maximale que tu peux allouer dans le tas. D'ailleurs, ça aurait été bien que tu nous donnes ici le résultat de cette commande.

    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?
    Non, justement, puisque ce n'est pas cette ligne qui a débloqué la chose. Si ton problème est intermittent, c'est-à-dire qu'un coup il marche, un coup il ne marche pas, alors ça semble confirmer le fait que tu sois effectivement allé flirter avec les limites de la mémoire disponible sur ton ordinateur. Un autre processus a dû se terminer entre temps et libérer juste assez de mémoire pour que ton programme « passe ». Ça veut dire que ton problème risque de se reproduire à tout moment.

    Par contre, chose importante : est-ce que « a » et « b » avaient toujours les mêmes valeurs quand tu as relancé 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!
    Donc, ça fait 500 Mo + 500 Mo + 500 Mo … etc.

    Tu travailles sur une machines 32 bits ou 64 bits ? Même si ton système utilise de la mémoire virtuelle, le système doit bien mapper tes blocs à des adresses différentes pour qu'ils puissent être exploités par ton programme. Si tu travailles en 32 bits, tu ne peux adresser que 4 Go, auquel il faut retrancher un 1 Go pour les entrées-sorties et le bus PCI, et un facilement autre pour le système d'exploitation. Si on ajoute le code de ton propre programme et des nombreuses bibliothèques qu'il utilise implicitement, au bout de 3 malloc de la même taille, tu as épuisé tout l'espace adressable, même s'il te reste de la place sur le swap.

    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.
    Dans ce cas-là, il faudra se plonger dans la doc de CPlex.

    Apparemment, tu as une formation en C sans être développeur/euse de métier. C'est très honorable en soi mais l'ennui avec les gens qui sont purement physiques ou mathématiques, c'est qu'un nombre est un nombre et que le coût en ressources d'une opération reste une chose abstraite.

    C'est généralement une bonne chose d'exploiter toutes les ressources disponibles d'une machine sans introduire d'overheads artificiels quand on est tout seul dessus mais, pour te donner une idée, si tu devais charger en mémoire tes données non pas depuis le disque mais depuis un serveur via une liaison ADSL par exemple, il te faudrait entre 1 et 4 heures rien que pour les rapatrier avant même d'entamer tout calcul.

    Dans cet exemple, tu peux te permettre de charger 400 Ko en une seule fois et de reprendre l'opération depuis le début si cela échoue. Si c'est 2 Go, tu es obligé(e) de découper cela en morceaux, de tenir compte de la surcharge du réseau, d'introduire des pauses pour éviter d'engorger le réseau et de se faire blacklister et, surtout, de permettre à l'utilisateur d'interrompre l'opération et la reprendre plus tard. Tu dois enfin tenir compte du fait que le programme peut planter ou la machine s'éteindre de façon inattendue. Ton programme doit alors pouvoir être suffisamment résilient pour reprendre au dernier checkpoint qu'il aura posé dans cette éventualité.

    Évidemment, tu n'en es pas là, mais c'est pour te donner une idée de ce qu'une simple augmentation en ressources peut impliquer.

  10. #10
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    ah non.. du nouveau Not enough space

    et un msg d'erreur:
    Run-Time Check Failure #3 - The variable '_HEAP_MAXREQ' is being used without being initialized.

  11. #11
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    D'ailleurs, ça aurait été bien que tu nous donnes ici le résultat de cette commande.
    Bon, lorsque ça tourné bien (tableau alloué) je n'ai pas fait attention à sa valeur.. mais la seul fois qu'elle a été affiché c'est avec la valeur 'ccccccccccccc'

    Si ton problème est intermittent, c'est-à-dire qu'un coup il marche, un coup il ne marche pas,
    Apparemment c'est ca! Toute à l'heure le tableau a été alloué, et maintenant non!

    alors ça semble confirmer le fait que tu sois effectivement allé flirter avec les limites de la mémoire disponible sur ton ordinateur.
    Alors une extension mémoire peut résoudre le problème? (travailler sur un pc de 4GO)

    Par contre, chose importante : est-ce que « a » et « b » avaient toujours les mêmes valeurs quand tu as relancé ton programme ?
    Pendant cette discussion oui ils ont les même valeurs.
    C'est sur 2 variables que je joue.. lorsqu'ils sont petit tout va bien.. lorsqu'ils sont de grande valeur non.

    Tu travailles sur une machines 32 bits ou 64 bits ?
    32 bits

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    Par défaut
    Citation Envoyé par mymimi Voir le message
    Bon, lorsque ça tourné bien (tableau alloué) je n'ai pas fait attention à sa valeur.. mais la seul fois qu'elle a été affiché c'est avec la valeur 'ccccccccccccc'
    C'est parce qu'il doit être défini dans un header que tu n'as pas inclus. Ton programme le prend par défaut pour une variable non déclarée, l'alloue quand même et lui assigne la valeur caractéristique des variables non initialisées lorsque tu travailles avec Visual.

    Ce n'est pas bien grave. Tu peux te contenter de supprimer cette ligne, maintenant.

    Alors une extension mémoire peut résoudre le problème? (travailler sur un pc de 4GO)
    Non. Tant que tu travailleras en 32 bits, tu auras le même problème.

    Mais ton problème vient essentiellement de la conception de ton programme. Les machines 64 bits ne sont répandues dans le grand public que depuis un période relativement récente. Il n'est pas normal que tu aies à déclarer n blocs de 500 Mo. Surtout que j'imagine que celui qui te pose problème n'était pas le dernier non plus. Combien, à terme, comptais-tu en allouer ?

    La solution se trouve dans la doc de CPLEX. Tu dois nécessairement pouvoir faire des calculs par morceaux. De là, tu déclares un bloc de taille beaucoup plus raisonnable (à l'estime, de 16 à 128 mégas maximum) et tu fais des itérations dessus.

  13. #13
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    La solution se trouve dans la doc de CPLEX. Tu dois nécessairement pouvoir faire des calculs par morceaux.
    Vraiment je ne trouve pas de solution et je ne sais pas quoi faire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CPXcopylpwnames(cpxenv, lp, numcol, numrow, objsen, obj, rhs, sense, matbeg, matcnt, matind, matval,lb, ub,NULL,varnames,NULL);
    CPXcopylpwnames est une fonction prédéfinie de cplex. Il faut la donner tout ces paramètres pour créer le problème à résoudre.
    matind et matval sont les 2 tableaux qui posent le problème de la consommation mémoire.. ils doivent passer dans les paramétres de cette fonction..donc je ne peut pas les découper..

    voilà la description détaillé de cette fonction:
    http://pic.dhe.ibm.com/infocenter/co...ylpwnames.html

  14. #14
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Bonjour
    Si c'est encore impossible, ton pc n'est pas capable de traiter ces données…
    Alors quelles sont les caractéristiques du pc capable de traiter ces données?

  15. #15
    Membre expérimenté Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Par défaut
    C'est pas ton PC le problème, c'est ton programme!

    Si tu distribues ton programme, disons, tu vas quand même pas exiger que tous tes clients (ou le parc informatique de ton entreprise) change de PC.


  16. #16
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Si tu distribues ton programme, disons, tu vas quand même pas exiger que tous tes clients (ou le parc informatique de ton entreprise) change de PC.

    Non pas besoin de distribuer mon programme.. (je fait un travail de recherche scientifique)
    Mon objectif est de faire augmenter les tailles des problèmes à résoudre avec le solveur cplex, jusqu'à il sera incapable de résoudre ses problèmes dans un temps raisonnable. Et là, je passe à un autre algorithme qui peut résoudre ses problèmes dans un temps raisonnable.. (et ça sa peut être distribué)
    Rq: Cplex peut résoudre toute taille de problème même s'il prends beaucoup de temps (des heures et même journée).. mais il fini à le résoudre.. donc forcément il fallait avoir une solution pour que le pc supporte tout ces données pour les envoyer à cplex..

  17. #17
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    Par défaut
    Il faut éplucher la doc CPLEX. Je t'avoue que je ne l'utilise pas et que cela ne se situe pas dans mon domaine de compétences, donc je ne peux pas te dire où ça se trouve, mais il y a forcément quelque chose pour permettre pour faire des traitements partiels.

    Autre question : quelle machine utilises-tu en particulier ? Quel est ton micro-processeur et de combien de mémoire vive disposes-tu actuellement ? Peut-être utilises-tu un O.S. 32 bits sur une machine capable de faire du 64.

  18. #18
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Autre question : quelle machine utilises-tu en particulier ? Quel est ton micro-processeur et de combien de mémoire vive disposes-tu actuellement ? Peut-être utilises-tu un O.S. 32 bits sur une machine capable de faire du 64.
    J'utilise HP 550, micro-processeur: Intel Core 2 Duo - 1.80GHz, RAM: 2Go

  19. #19
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    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 504
    Par défaut
    Ton micro-processeur est en soi un 64 bits. Il faudrait donc que tu utilises un O.S. 64 bits également. Toutefois, le réinstaller pour si peu est une opération lourde.

    Si tu as accès à un PC 64 bits avec plus de mémoire et un O.S. à niveau, essaie de voir si ton programme fonctionne dessus. C'est comme ça que tu perdras le moins de temps à court terme. Si ça bugue encore, pas le choix : plonge dans la doc de CPLEX.

  20. #20
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Merci beaucoup
    Je vais essayer l'une de ces 2 solutions..

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