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 :

Gros Tableaux en C [En attente]


Sujet :

C++

  1. #21
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    salut.

    A confirmer. tu ne peux pas allouer 2go comme ça. tu exploses la pile.
    par contre faire une allocation dynamique avec un bon vieux malloc ou new ne posera pas de souci.
    c'est ce que j'ai constaté quand j'ai voulu allouer 600Mo dans une fonction.

  2. #22
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    salut.

    A confirmer. tu ne peux pas allouer 2go comme ça. tu exploses la pile.
    par contre faire une allocation dynamique avec un bon vieux malloc ou new ne posera pas de souci.
    c'est ce que j'ai constaté quand j'ai voulu allouer 600Mo dans une fonction.
    C'est bien de lire les messages précédents avant de poster.

    Là il alloue sur le tas puisqu'il utilise des variables globales.
    Mais ce qui m'étonne un peu, c'est que sous windows, on peut allouer plus grâce à des variables globales qu'avec un new, alors que sous débian (virtualisé en plus), c'est l'inverse et j'ai même réussi à allouer l'espace qu'il souhaitait.

    Ce qui est aussi marrant, c'est que le fait de faire planter l'allocation pour les variables globales fait planter le programme avant l'entrée dans le main et que ce dernier retourne 0 sans aucun message d'erreur.

    Mais je pense que dans ce cas là, c'est surtout un problème de conception.

  3. #23
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    dsl. pas bien vu sur l écran du portable.


    je ne suis pas expert linux. mais quasi tout est configurable. il doit exister des variables à augmenter pour son souci.
    sous Windows, il y a la base de registre. c'est comme ça qu'on avait réglé des pb de taille de stack ip.

  4. #24
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Points : 0
    Points
    0
    Par défaut
    oui j ai besoin d autant et je vais meme avoir besoin de plus !
    Je ne sais pas si j'ai le droit de dire pourquoi j ai besoin d autant de donnees ... je crois que j ai une clause de confidentialite, je vais verifie.

    Je ne peux rien désallouer, j ai besoin de tout en meme temps.

    Je sais ce qui est modifie et quand c est modifie (j implement seul un algorithme)
    Je ne programme pas pour suivre des principes mais pour obtenir des resultats et en plus je ne suis pas en multithread.

    J ai 8Go de RAM et 12Go de cache donc il doit y avoir un moyen de le forcer a accepter. Je pense peut etre qu avec une machine virtuelle il y a moins de verification.

  5. #25
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Question idiote peut être mais tu as bien un windows 64 bits ?

    En 32 bits tu es bridé à 3Go (4Go en théorie, mais windows bride la mémoire). Ca plus la fragmentation, il est fort probable que le système n'arrive pas à t'allouer toute la mémoire que tu demande.

    Sinon je rejoins l'avis de Neckara. Avoir besoin d'autant de mémoire en un seul block révèle souvent une erreur de conception dans l'algo. Pour travailler sur de l'out of core avec des données pouvant aller au To, je t'assure qu'on alloue jamais plus de quelques centaines de Mo en une fois...
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  6. #26
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par pyros Voir le message
    Sinon je rejoins l'avis de Neckara. Avoir besoin d'autant de mémoire en un seul block révèle souvent une erreur de conception dans l'algo. Pour travailler sur de l'out of core avec des données pouvant aller au To, je t'assure qu'on alloue jamais plus de quelques centaines de Mo en une fois...
    Ca dépend du type de données et de l'analyse que tu en fais.

    Pour avoir bosser sur les systèmes d'écoutes, les quantités de données à traiter sont énormes.

  7. #27
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Ca dépend du type de données et de l'analyse que tu en fais.

    Pour avoir bosser sur les systèmes d'écoutes, les quantités de données à traiter sont énormes.
    Mais de là à allouer 2Go dans une variable global au début du programme, je suis sceptique... Ou peut être cas très spécifique d'embarqué où l'allocation dynamique est interdite. On voit de ces choses des fois
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  8. #28
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par pyros Voir le message
    Mais de là à allouer 2Go dans une variable global au début du programme, je suis sceptique... Ou peut être cas très spécifique d'embarqué où l'allocation dynamique est interdite. On voit de ces choses des fois
    On avait un cluster de PC.
    On avait plusieurs processus qui allouaient qq centaines de Mo. Et on en avait 1 (le superviseur) qui allouait presque 2Go. Comme je l'ai dit (hier), c'était de l'allocation dynamique. On n'a jamais eu de souci (sous SUSE 10)
    Ce n'est pas moi qui ait fait le superviseur, donc je ne peux pas dire si c'était un seul malloc ou plusieurs.

    @Emmanuel_exeter, ton processus doit être multi-plateforme ?

  9. #29
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Points : 0
    Points
    0
    Par défaut
    Non, l important est de faire tourner l algo est d avoir des resultats

  10. #30
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    c'était de l'allocation dynamique
    En dynamique OK. Mais en statique je trouve ça quand même très osé...

    @Emmanuel_exeter Alors, 32 ou 64bits ? Et tu es sûr de ne pas vouloir utiliser des new ou des std::vector ? Ca m'étonne quand même que la différence de perf soit si élevée.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  11. #31
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    J'ai pris le train en marche et j'ai du mal à accrocher.
    Pour compléter les tests de Neckara.

    Je viens de mettre ton code dans Visual Studio.
    avec #define A 490294Le linker m'insulte en disant :
    LINK : fatal error LNK1248: image size (934C1000) exceeds maximum allowable size (80000000)
    Donc sous Windows (XP dans mon cas), on est limité à environ 80Mo en allocation statique.
    Erreur !!!
    avec #define A 49294Il ne me dit rien alors qu'on alloue 200Mo.

    [edit]
    ca ne résoud pas le pb, mais j'ai trouvé un truc intéressant ici.

    Thus if you allocate an array dynamically (the limit is large and described in detail by other posts.

    int a1 = new int[SIZE]; // SIZE limited only by OS/HardwareAlternatively if the array is allocated on the stack then you are limited by the size of the stack frame. N.B. vectors and other containers have a small presence in the stack but usually the bulk of the data will be on the heap.

    int a2[SIZE]; // SIZE limited by COMPILER to the size of the stack frame

  12. #32
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2012
    Messages : 11
    Points : 0
    Points
    0
    Par défaut
    64 bits

  13. #33
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    D'après l'article suivant http://www.viva64.com/en/k/0036/ les tailles maximales des différents segments de mémoire sous Windows sont :

    Static data (variables globales) : 2Gb (32 bits et 64bits)
    Stack data : 1mb (32 bits et 64 bits)
    Dynamic data (Heap): 2Gb en 32 bits 8Tb en 64 bits

    Donc le seul moyen de manipuler des tableaux de plus de 2Gb est de les allouer dynamiquement (avec des new[]/delete[]) et de compiler en 64 bits

    Si ça plante encore à l’exécution, alors c'est que :

    - Il y a un autre bug ailleurs dans le programme.
    Ou :
    - Le projet est configuré pour compiler en 32 bits. Je ne connais pas Code::blocks mais je suis presque certain que par défaut Code::block compile pour du 32 bits.

  14. #34
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par Arzar Voir le message
    - Le projet est configuré pour compiler en 32 bits. Je ne connais pas Code::blocks mais je suis presque certain que par défaut Code::block compile pour du 32 bits.
    Oui, par défaut C::B est "livré" avec minGW32, il faut installer (séparément) MinGW64 et configurer C::B pour faire du 64bit.

  15. #35
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Utiliser MinGW, même 64 bits, est plutôt une mauvaise idée. Ce serait plus malin d'utiliser Visual C++ Express, surtout lorsqu'on touche un peu aux limites de l'OS.

    Citation Envoyé par Emmanuel_exeter Voir le message
    Je ne programme pas pour suivre des principes mais pour obtenir des resultats
    Les principes ne sont pas là pour faire beau mais pour aider à construire correctement des programmes qui donnent des résultats. Si tu ne veux pas faire d'efforts, tu prends Matlab ou Python, pas C++.
    Find me on github

  16. #36
    Invité
    Invité(e)
    Par défaut
    et le tableau c'est obligatoire?

    Parce que bon une zone contigue de memoire de 2Go...
    pourquoi ne pas stocker des tableaux de tableaux...c'est deja un peu moins contraignant...

  17. #37
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Emmanuel_exeter Voir le message
    Oui le probleme est la evidemment. Notons que ca marche avec (1500+1500)*500000
    De plus, 2250000000 octets ne fais en fait "que" 2,14Go !

    J'ai essayer de lancer code::block en mode administrateur mais c est exactement pareil. Je ne peux pas lancer l executable en mode administrateur car quand je lance le .exe cree windows me dit: BlahBlahBlah.exe is not a valid Win32 application.

    Je pourrai me debrouiller pour diviser la taille par 4 mais je vais avoir plus de donnees a prendre en compte bientot donc ca ne fera que repouser le probleme...

    Merci
    2,14 Go, c'est un poil supérieur à ce que Win32 accepte d'allouer à chaque process (2Go). A moins d'utiliser le flag de boot correspondant (permettant d'avoir 3Go pour chaque processus), je ne vois pas comment tu peux espérer que ça passe. Win64 n'est guère plus gentil avec toi : la limite de 2 Go est gardée par défaut si je me rappelle tout bien.

    Tu as un gros, gros problème, principalement lié à tes algorithmes. Pense quand même que Rage d'id Software nécessite 1 To de données lorsque celles-ci sont décompressée. Question 1 : est-ce que ces 1 To sont tout le temps nécessaire ? Probablement pas. Parce que le jeu propose des algorithmes relativement malin pour utiliser ces données au mieux. D'où la question 2 : a tu besoin de 2 Go de données tout le temps ? Surement pas non plus.

    Bref, ta seule solution, c'est de retourner à tes cahier, et de réfléchir à une solution simple, efficace, pour contourner un problème de big data. Selon le type de données (numériques, texte, ...) la solution peut varier du tout au tout.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  18. #38
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 576
    Points : 1 528
    Points
    1 528
    Par défaut
    a tu besoin de 2 Go de données tout le temps ? Surement pas non plus
    Ca peux se justifier dans certain cas. Sans même parler de clusters ou de gros systèmes, j'ai déjà vue des applis tourner en consommant une 10aine Go de ram sur un PC "classique". Mais pas en une seul zone mémoire et encore moins en statique.
    La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer. - Antoine de Saint-Exupéry

  19. #39
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Win64 n'est guère plus gentil avec toi : la limite de 2 Go est gardée par défaut si je me rappelle tout bien.
    SI je comprends bien http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx IMAGE_FILE_LARGE_ADDRESS_AWARE est activé par défaut sur Win64, donc apparemment il n'y a pas besoin de faire qqchose de spécial pour profiter des 8TB de mémoire virtuelle assignable (à part compiler en mode 64 bits)

    Citation Envoyé par msdn
    User-mode virtual address space for each 64-bit process :

    With IMAGE_FILE_LARGE_ADDRESS_AWARE set (default):
    x64: 8 TB
    Intel Itanium-based systems: 7 TB

    With IMAGE_FILE_LARGE_ADDRESS_AWARE cleared:
    2 GB

  20. #40
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 364
    Points : 5 378
    Points
    5 378
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    a tu besoin de 2 Go de données tout le temps ? Surement pas non plus.
    Pour en revenir à mon expérience : système d'écoute (espionnage ?) temps réel conçu par un grand groupe mondial pour les Armées, il faut en permanence énormément de données pour décoder/décrypter les informations.
    Mais bon, ne connaissant pas la conception du programme de Emmanuel_exeter, il est difficile de savoir s'il est possible de "partager" toutes les données dans différents processus pour avoir au total toujours 2Go d'allouer mais par plusieurs processus.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. passage de gros tableaux par adresse
    Par ol9245 dans le forum MATLAB
    Réponses: 7
    Dernier message: 10/10/2012, 11h51
  2. Gros tableaux chronologiques
    Par regdobey dans le forum C#
    Réponses: 2
    Dernier message: 20/07/2009, 21h04
  3. Gestion de gros tableaux
    Par DranDane dans le forum ASP.NET
    Réponses: 4
    Dernier message: 01/09/2008, 15h31
  4. Réponses: 1
    Dernier message: 06/08/2008, 09h35
  5. [Tableaux] Livre d'or gros problème
    Par mesdy dans le forum Langage
    Réponses: 8
    Dernier message: 08/05/2007, 16h46

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