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 de mémoire supérieur à 4294967295 bytes


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut Allocation de mémoire supérieur à 4294967295 bytes
    Bonjour,

    Dans ma classe Matrix, je dois créer un buffer d'une taille de n x n (n=100288)=10057682944 double (4 bits). Bien évidemment ça plante!
    ---------------------------
    Microsoft Visual C++ Debug Library
    ---------------------------
    Debug Error!

    Program: ...

    Invalid allocation size: 4294967295 bytes.


    (Press Retry to debug the application)
    ---------------------------
    Abandonner Recommencer Ignorer
    ---------------------------
    Bon je dois sauver toutes ses valeurs et y accéder facilement (rapidement si possible), ça ne me dérange pas que ma matrice soit sauvegarder dans un fichier. Comment dois-je faire?

    Cordialement,
    Rodrigue

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    100 000², ce qui donne environ 40Go - 4 octets -, ce que peu de PCs peuvent supporter.
    La seule solution : faire autrement. Par exemple en gérant la matrice comme un proxy qui va en fait chercher et calculer sur le disque dur.

  3. #3
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Purée ! Oui j'ai calculé, cela fait: 37.47Go
    Donc en gros, je vais me créer un fichier de 37.47Go sur le disque dur (rien que ça)... et inscrire mes données dedans. Puis je me déplace à un certains offset pour écrire ou relire mes valeurs.
    Note: tout ça en NTFS, parce que le FAT32 ne supporte pas plus de 2Go/fichier, donc dans ce cas il faudrait que je segmente ma matrice en plusieurs fichiers . Dans un premier temps, supposons que je suis en NTFS.
    Je pense que je vais utiliser une propriété de symétrie de ma matrice (même si ça va me demander plus de calcul, ça ira toujours plus vite que d'aller lire sur le disque dur). Je n'aurais alors plus qu'un fichier de 18.733Go. Cela reste honorable !

    Hum ! Quelques questions:
    1. Comment créer un fichier sur le disque dur et lui allouer directement une certaine taille (~20Go) ? Je pense que c'est mieux de lui allouer directement sa taille... comme ça s'il n'y a pas assez de place sur le disque dur je génère une erreur!
    2. Je connais la fonction fseek en C pour me déplacer dans un fichier mais est-ce que c'est la fonction à utiliser en C++ (STL)?
    3. Comment remplacer x octets par d'autres octets à un endroit quelconque d'un fichier?
    Et merci beaucoup!

  4. #4
    Membre éclairé Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Par défaut
    Bon après le choc que j'ai eu j'ai réfléchis!
    Je vais utiliser un std::stream (je ne sais pas si je dois utiliser un ofstream et ifstream ou si je peux m'en passer et n'utiliser qu'un std::stream?).
    Celui-ci à des fonctions seekg, seekp et tellg (il faut que je regarde laquelle utiliser).
    Pour écrire à un endroit du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double x[10];
    double y;
    ofstream f("rodrigue.bin",ios::binary);
    f.write((const char*)x, 10*sizeof(double));
    f.write((const char*)&y,sizeof(double));
    f.close();
    Pour lire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ifstream g("rodrigue.bin",ios::binary);
    g.read((char*)x,10*sizeof(double));
    g.read((const char*)&y, sizeof(double));
    g.close();
    Voilà je ne sais toujours pas comment aller placer le pointeur à un endroit donner de mon fichier, ni comment lui allouer une taille prédéterminée (20Go). Je pense également que fstream ne sait gérer que des fichiers de 2Go car son pointeur est un long.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pour aller à un endroit donné, il faut aller un peu plus loin dans la doc et aller à seekg.
    Ensuite, je ne suis pas sûr que streampos ne puisse pas aller au-delà des 2Go, c'est un objet, pas un long, à priori.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il y a je crois des fonctions de l'API Windows pour faire des accès aléatoires dans de gros fichiers et en récupérer des morceaux.

Discussions similaires

  1. Problème d'allocation de mémoire dans la pile
    Par prophet666 dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 19/01/2006, 02h22
  2. [Debutant]Allocation de mémoire
    Par gwendal84 dans le forum C
    Réponses: 6
    Dernier message: 07/12/2005, 19h04
  3. Double allocation de mémoire
    Par hunter001 dans le forum C++
    Réponses: 16
    Dernier message: 25/08/2005, 13h53
  4. probleme d allocation avec un tableau de BYTE
    Par e1lauren dans le forum C++
    Réponses: 5
    Dernier message: 06/05/2005, 13h42
  5. pb d'allocation de mémoire
    Par shura dans le forum C
    Réponses: 7
    Dernier message: 17/04/2005, 21h10

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