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 :

Gestion allocation m�moire


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par d�faut Gestion allocation m�moire
    Bonjour � tous,
    J'ai un fichier texte (segments.txt) qui contient des nombres tri�s par taille croissante.
    La taille du fichier est sup�rieure � la m�moire RAM.
    Je recherche les couples de nombres tel que : segment_2 (ligne j) / segment_1 (ligne i) = 2
    J'ai le message d'erreur bad_alloc car mauvaise gestion de la m�moire.
    Comment faire une allocation judicieuse de la RAM ?
    Merci d'avance.
    Mon code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
     
    #include <iostream>
    #include <vector>
    #include <fstream>
    #include <string>
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <sys/time.h>
    #include <unistd.h>
    using namespace std;
     
    struct Data1 
    {
             double seg_{};
    };
     
    // -------------------------------------------------------------------------
     
    int main() 
    {											
     
        std::ifstream file("segments.txt");
        if(!file) 
        {
              std::cerr << "file not found" << std::endl;
              return 1;
        }
     
        std::vector<Data1> datas1;
        Data1 data1;
     
        while(file >> data1.seg_)
        {
                datas1.push_back(data1);
        }
     
    // ------------------------------------------------
     
    int i,j;
    double delta,precision;
     
    precision = 0.0000001;
     
    i = 0;
    j = 1;
     
    ici_1:   delta = (2*datas1[i].seg_) - datas1[j].seg_;
     
    if ((delta >= 0 && delta <= precision) || (delta <= 0 && delta > -precision))
    {											
               printf("%4.15f   %4.15f  \n",datas1[i].seg_,datas1[j].seg_);						
    }											
     
    if (delta > -precision)
    {
             j = j + 1;
             if (j > datas1.size()) break;
             {
                         goto ici_2_init;
              }
              goto ici_1;
    }
    else
    {
             i = i + 1;
             if (i > datas1.size()) break;
    }
     
    ici_2_init:       ;	 
     
     
    }

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    "goto" est une erreur de syntaxe commise il y � 37 ans en r�digeant la norme C++. Et jamais personne ne l'utilisa...
    Es-tu s�r que ton fichier ne tiens pas en m�moire, on devrait pouvoir charger 200 000 000 de double en m�moire?

    Attention if ( j > datas1.size() ) n'est pas le bon test s'assurer que j est utilisable, il faut plut�t if ( j >= datas1.size() ).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par d�faut
    Bonjour Dalfab,

    Mon fichier comprends 160 millions de segments ... soit 19,5 GB !

    Mon calcul fait un rapport entre 2 segments qui doit �tre �gale � 2 (seg_j / seg_i = 2) mais les 2 segments se trouvent sur des lignes non contigus qui peuvent �tre tr�s distantes.
    Les segments soient trill�s par taille croissante.

    Merci.
    Marc

  4. #4
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    160 millions de doubles, �a fait 160 millions * 8 = 1,3GigaOctets
    Et si tu les mettais dans des float, cela devrait suffire pour une comparaison "normale" et ferait 600M qui devrait passer. Mais une precision de 0.0000001 ne fonctionnera peut-�tre les donn�es par paquets de 100000 et re-parcourir le fichier pour les comparer � tous les autres. En utilisant le fait que les donn�es sont tri�es, il y des possibilit�s de ne pas y passer trop de temps.
    Un d�tail, penser � compiler en mode release plut�t que debug, il peut y avoir un gain de place (surement faible) et surtout un gain de CPU.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    14
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 14
    Par d�faut
    En r�alit� mon fichier contient d'autres champs dont j'ai besoin. Le fichier fait en tout 19,5 GB.
    Je vais passer les long en float dans mon programme, cela devrait diminuer sensiblement la taille.
    Idem pour Debug > Release ...
    Merci.

  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
    A tout hasard, tu ne pourrais pas modifier la g�n�ration du dit fichier pour mettre en �vidence ces couples?

    Autre possibilit� peut-�tre int�ressante.

    Soient quatre nombres a1, a2, b1, b2, tels que a1/b1 = 2 et a2/b2 = 2.
    alors si a1 < a2, b2 < b1.

    Voyons l'ensemble des nombres comme une s�quence.
    Le premier a est son d�but, le premier b sa fin.

    si a/b < 2, il faut augmenter a donc avancer dans la liste. Sinon, il faut augmenter b (donc reculer dans la liste)

    Donc si tu parcours les a dans l'ordre croissant, et les b dans l'ordre d�croissant, tu n'as pas besoin de tout le fichier (et donc, pas besoin de le stocker int�gralement)
    Si tu cr�e une copie du fichier tri� en ordre d�croissant, il suffit de lire dans dans les deux fichiers dans l'ordre naturel des fichiers.

Discussions similaires

  1. Gestion des allocations m�moires
    Par Khan34 dans le forum C++
    R�ponses: 10
    Dernier message: 25/04/2012, 15h04
  2. strat�gie de gestion d'�chec d'allocation m�moire
    Par vitoubien dans le forum D�buter
    R�ponses: 11
    Dernier message: 14/08/2009, 21h32
  3. Allocation m�moire
    Par DestyNov@ dans le forum C++
    R�ponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation m�moire
    Par Rayek dans le forum Langage
    R�ponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation m�moire dynamique
    Par ITISAR dans le forum VB 6 et ant�rieur
    R�ponses: 6
    Dernier message: 21/01/2005, 09h59

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