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

Langage C++ Discussion :

Limite pour la taille d'un vector


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Par défaut Limite pour la taille d'un vector
    Bonjour à tous!

    Bon... j'ai un petit problème technique à vous poser... J'ai un programme (VC++) qui insére des strings de longueur 100 (environ) dans un vector<string>.
    Il doit ensuite trier ce vector puis le lire pour écrire dans des fichiers ce qu'il contient. C'est un peu résumé mais en gros c'est ça...

    Bref, je m'aperçois que potentiellement, mon programme doit pouvoir extraire et stocker dans ce vector 34 000 000 de strings... Pour ensuite les trier et les lire.

    Pensez-vous cela possible? J'ai du mal à croire que beaucoup de PC puissent tenir la charge...

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Sa devrait prendre dans les 200mo... donc ça passe .

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Par défaut
    Cool!

    Mais quel calcul tu fais pour trouver ça? Je ne trouve que des tailles aberrantes...

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Si ça peut aider, std::vector possède une fonction max_size() qui renvoit la longueur maximale théorique d'un vector atteignable par la machine.

    Mais bon, dans ton cas, il me semble que c'est rapé :

    En supposant qu'une string de longueur 100 fasse environ 100 octets :

    34 000 000 * 100 = 3 400 000 000 octets
    3 400 000 000 / 1024 = 3320312 ko
    3320312 / 1024 = 3242 mo
    3242 / 1024 = 3.1 go !

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Par défaut
    Ouai voilà! C'est ce que j'avais trouvé aussi... du coup c'est grillé...

    En fait pour expliquer un peu le contexte, j'ai environ 10 000 fichiers contenant chacun près de 4 000 lignes. Le tout prend entre 3 et 4 Go sur un DVD. Le but est de stocker ces lignes dans un conteneur, de les trier, puis de les réécrire (après un formatage spécial) des des fichiers séparés (A savoir un fichier pour chaque lignes commençant par les mêmes 10 caractères). Sur un traitement de 60 fichiers en entrée, ça me donne environ 800 fichiers en sortie. Je pense que ce nombre ne devrait pas exéder les 1000 quelque soit le nombre de fichiers en entrée.

    Bref, toujours est-il qu'il faut que je stocke et trie 10 000 x 4 000 = 40 000 000 de lignes......

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par caradhras Voir le message
    Le but est de stocker ces lignes dans un conteneur, de les trier, puis de les réécrire (après un formatage spécial) des des fichiers séparés (A savoir un fichier pour chaque lignes commençant par les mêmes 10 caractères).
    Je ne vois pas bien pourquoi tu as besoin de trier toutes les chaînes d'un coup pour faire ça.
    Tu commences par créer les fichiers de destination en ajoutant chaque chaîne dans son fichier, puis tu reprends chaque fichier que tu tries indépendamment des autres.

    MAT.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Arzar Voir le message
    En supposant qu'une string de longueur 100 fasse environ 100 octets :
    Salut,
    Pourquoi la longueur d'une string devrait être proportionnelle à sa taille ? Il peut y avoir un buffer séparé avec une allocation dynamique dédiée non ?

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 17
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    Salut,

    Une string contient trois pointeurs (vers la chaine, vers la fin de la chaine et vers la fin de la zone allouée) et une allocation dynamique qui correspond à la taille de la chaîne.

    Une string de 100 caractères pèse donc 103 octets (3 en statique et 100 en dynamique).

  9. #9
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Bonjour,
    Si ça peut aider, std::vector possède une fonction max_size() qui renvoit la longueur maximale théorique d'un vector atteignable par la machine.

    Mais bon, dans ton cas, il me semble que c'est rapé :

    En supposant qu'une string de longueur 100 fasse environ 100 octets :

    34 000 000 * 100 = 3 400 000 00 octets
    3 400 000 000 / 1024 = 3320312 ko
    3320312 / 1024 = 3242 mo
    3242 / 1024 = 3.1 go !


    Omg... je crois que j'ai oublier un zéro dans mon calcul xD.

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 17
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Par défaut
    100 * 34 000 000 = 3 400 000 000 octets ~ 3 Go.

    Ca passe pas...

    Déjà si tu as autant de strings tu dois avoir des fichiers énormes!

    Les solutions que je vois, c'est d'utiliser des choses comme le tri par fusion avec des fichiers: tout d'abord tu fais plusieurs fichiers avec par exemple dans chacun 1000 strings triées, et ensuite tu appliques le tri par fusion à ces fichiers en créant à chaque fois un fichier de la taille de la somme des deux fichiers desquels il est issu...

    Le tri par fusion ne te demande que de lire les fichiers ligne à ligne, sans devoir les stocker intégralement en mémoire, ce qui fait que tu auras une consommation mémoire quasi nulle

Discussions similaires

  1. Taille limitée pour Javascript ?
    Par pascal_06 dans le forum Général JavaScript
    Réponses: 22
    Dernier message: 08/02/2011, 22h00
  2. [Tableaux] Une taille limite pour un array ?
    Par Xunil dans le forum Langage
    Réponses: 12
    Dernier message: 05/12/2006, 14h09
  3. Taille limite pour un BufferedReader
    Par iohack dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2006, 17h42
  4. [Système] Taille limite pour fopen ?
    Par blinkseb dans le forum Langage
    Réponses: 1
    Dernier message: 16/05/2006, 14h54
  5. [FLASH MX] Taille limite pour les images
    Par ptijo dans le forum Flash
    Réponses: 1
    Dernier message: 24/02/2006, 07h53

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