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

  2. #22
    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?

  3. #23
    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.

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

  5. #25
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    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).
    Je pense que nous somme sur la bonne voie..
    Je travaille sur VS 2008..
    J'ai fait Projet->Propriétés->Editeur de liens->Système ->Activation des longues adresses: là 3 options:
    -par défaut (activé)
    -Ne pas prendre en charge les adresses de plus de 2*gigaoctets (/LARGEADDRESSAWARE:NO)
    - Prendre en charge les adresses de plus de 2*gigaoctets (/LARGEADDRESSAWARE)

    Et après?

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

    Je n'ai pas lu les articles plus que ça, mais ils sont pertinents je pense :

    http://social.msdn.microsoft.com/For...-70847abae831/

    http://msdn.microsoft.com/en-us/library/aa366778.aspx

    Ca confirmerait qu'un programme n'a droit qu'à 2Go d'espace d'adressage sous seven (dll incluses). Si tu dépasses cette limite, il y a une exception. Visiblement travailler en 64 bits permettrait d'étendre les possibilités (à confirmer).

    PS: allouer plus d'un Go de mémoire vive n'a que très peu de sens, on passe par un fichier ou une base de données. Ce ne sera ni plus ni moins performants. Dans tous les cas, ce problème d'allocation n'aurait plus lieu d'être, un souci en moins.

    PS2: j'ai testé il y a quelques années d'allouer 1 Go sur un Windows XP (Visual Studio 2003), ça prenait environ 1 minutes sur ma machine...

  7. #27
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 573
    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 573
    Par défaut
    LargeAddressAware ne t'apportera rien, étant donné que ça va te permettre de monter jusqu'à 3 Gio au lieu de 2, au prix d'une certaine complexité et tu n'es de toutes façons pas équipée de plus de 2 Gio de RAM.

    Ça reste intéressant si le système est capable d'utiliser le swap à la place, mais il faudra quand même décharger une autre page de mémoire physique pour la remapper à cette place. Ça va être costaud.

    Est-ce qu'on peut savoir quel genre de problème nécessite de charger des blocs de 500 méga-octets à chaque fois ? Oui c'est de la PL, mais encore ?

  8. #28
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Ce qui m'étonne depuis le début, c'est cet objectif de tout mettre en mémoire vive pour l'envoyer à CPLEX. Quand on lit une vidéo de 1Go, la vidéo n'est pas placée entièrement dans la mémoire vive.
    Je pense que ton problème mathématique doit pouvoir être descriptible dans un fichier (mémoire morte) et le logiciel CPLEX se débrouille. C'est lui qui saturera ta mémoire à essayer de résoudre.

  9. #29
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Bonjour
    Est-ce qu'on peut savoir quel genre de problème nécessite de charger des blocs de 500 méga-octets à chaque fois ? Oui c'est de la PL, mais encore ?
    Les problèmes d'optimisation combinatoire qui peuvent être rencontrés dans plusieurs domaines: transport, ordonnancement, industrie,.. en faite, ses problèmes sont complexes (notion de la complexité algorithmique).. Bon c'est trop long pour décrire.. c'est de la recherche opérationnelle.

    Je pense que ton problème mathématique doit pouvoir être descriptible dans un fichier (mémoire morte) et le logiciel CPLEX se débrouille. C'est lui qui saturera ta mémoire à essayer de résoudre.
    Exactement, on doit envoyer tout ces données à une fonction prédéfinie de cplex pour créer ce fichier .pl décrivant le problème mathématique et puis CPLEX se débrouille à le résoudre.

  10. #30
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    PS2: j'ai testé il y a quelques années d'allouer 1 Go sur un Windows XP (Visual Studio 2003), ça prenait environ 1 minutes sur ma machine...
    Très bien donc surement il y a une solution pour mon problème.. et ta machine était de 32 ou 64 bit?

  11. #31
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Les XP 64bits ont été d'une rareté absolue... donc on peut dire à coup sûr : 32bits.

    Ton fichier .pl que tu enverras à CPLEX, il faut "obligatoirement" créer un gigantesque tableau et le donner à la fonction ?
    Ton tableau contient "énormément" d'entiers, et CPLEX n'aurait aucune autre méthode que de devoir prendre un tableau qui ne peut pas tenir sur un Windows ?
    A ce niveau, pas sûr que le forum soit le meilleur endroit pour demander... contacte IBM pour savoir quelle méthode employer dans ton cas...
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  12. #32
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 573
    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 573
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Ce qui m'étonne depuis le début, c'est cet objectif de tout mettre en mémoire vive pour l'envoyer à CPLEX. Quand on lit une vidéo de 1Go, la vidéo n'est pas placée entièrement dans la mémoire vive. Je pense que ton problème mathématique doit pouvoir être descriptible dans un fichier
    Oui, c'est ce que l'on dit depuis le début.

    Citation Envoyé par mymimi Voir le message
    Bonjour Les problèmes d'optimisation combinatoire qui peuvent être rencontrés dans plusieurs domaines: transport, ordonnancement, industrie,.. en faite, ses problèmes sont complexes (notion de la complexité algorithmique).. Bon c'est trop long pour décrire.. c'est de la recherche opérationnelle.
    Oui, ça je suis bien d'accord mais quel genre de source peut te pondre 500 mégas de données insécables ?

    Exactement, on doit envoyer tout ces données à une fonction prédéfinie de cplex pour créer ce fichier .pl décrivant le problème mathématique et puis CPLEX se débrouille à le résoudre.
    Ce n'est pas ce qu'on a dit : tu ne devrais pas avoir besoin de charger d'un coup toutes les données : il faudrait plutôt trouver la fonction qui permette de passer directement le fichier à CPLEX qui — lui — se chargera d'allouer la mémoire dont il a besoin pour résoudre ton problème.

  13. #33
    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.

    Citation Envoyé par mymimi Voir le message
    Très bien donc surement il y a une solution pour mon problème.. et ta machine était de 32 ou 64 bit?
    Ca remonte à 7 ans environ, du 32 bits.

    Pour ton problème, la solution est simple. Tu es obligé d'allouer des quantités de mémoire qui dépassent la capacité du processus. Dans ce cas tu dois faire du multiprocess.

    Un process = 2Go.
    deux process = 4Go.
    etc..

    Ensuite faire communiquer les processus... Soit par réseau/mémoire partagée.

  14. #34
    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
    Citation Envoyé par mymimi Voir le message

    Exactement, on doit envoyer tout ces données à une fonction prédéfinie de cplex pour créer ce fichier .pl décrivant le problème mathématique et puis CPLEX se débrouille à le résoudre.
    Ce qui m'étonne, c'est que si tu envoies des Go de données à CPLEX, il va souffrir du même problème de taille maximale d'espace d'adressage...

  15. #35
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 573
    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 573
    Par défaut
    Hello,

    Citation Envoyé par moldavi Voir le message
    Pour ton problème, la solution est simple. Tu es obligé d'allouer des quantités de mémoire qui dépassent la capacité du processus. Dans ce cas tu dois faire du multiprocess.

    Un process = 2Go.
    deux process = 4Go.
    etc..
    Ce n'est franchement pas plus propre (mais alors vraiment pas) et ça ne règle pas son problème.

    Citation Envoyé par moldavi Voir le message
    Ce qui m'étonne, c'est que si tu envoies des Go de données à CPLEX, il va souffrir du même problème de taille maximale d'espace d'adressage...
    L'idée est que l'on passe à CPLEX un pointeur vers des données en mémoire, donc le logiciel ne se pose pas du tout la question. Si tu lui laisses la responsabilité de les charger lui-même, il va gérer sa mémoire correctement. Et s'il ne sait pas le faire, il y a forcément, quelque part, quelque chose qui permette de passer les blocs de données en plusieurs fois.

  16. #36
    Membre averti
    Inscrit en
    Avril 2013
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 23
    Par défaut
    Bonjour à tous
    J'ai fait quelques ajustement dans les malloc de telles façon ne pas allouer plus que besoin (mais ça reste comme même des tableaux de grandes tailles )
    En plus, j'ai fait quelques modifications dans les fichiers sources (les instances du problème) pour ne pas avoir besoin de tableaux plus grands et consommateur de mémoire et en même temps en assurant une bonne qualité de résultats.

    En conclusion:
    Le problème n'étais pas dû à Cplex ni à malloc ni à la gestion de mémoire non plus à mon PC.. mais plutôt au choix des instances à résoudre avec Cplex il faut bien choisir et créer des instances non consommatrices de mémoire.

    L'idée est que l'on passe à CPLEX un pointeur vers des données en mémoire, donc le logiciel ne se pose pas du tout la question. Si tu lui laisses la responsabilité de les charger lui-même, il va gérer sa mémoire correctement. Et s'il ne sait pas le faire, il y a forcément, quelque part, quelque chose qui permette de passer les blocs de données en plusieurs fois.
    L'idée cplex est claire et simple:
    - on passe à CPLEX un pointeur vers des données en mémoire
    - on appelle une fonction de cplex qui crée le fichier .lp à partir de ces données
    - on appelle une fonction de cplex pour la résolution.

    (Le truc difficile c'est comment organiser ses données dans les tableaux connues par cplex pour que ce dernier crée le fichie .lp correctement.. sinon il n'a rien à résoudre )

    Je remercie tout ceux qui ont participé dans cette discussion

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