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 Delphi Discussion :

Taille maximale de la mise en mémoire d'un exécutable


Sujet :

Langage Delphi

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Taille maximale de la mise en mémoire d'un exécutable
    J'aimerai savoir s'il y a une limitation de taille à la mise en mémoire d'un logiciel.
    Je travail sur des image et ai besoin de créer de grands Bitmap. Or dés qu'en RAM le logiciel dépasse environ 1,3 Go j'obtiens comme message : "Le projet a déclenché la classe d'exception EOutOfRessource avec le message 'Ressource système insuffisantes'."
    J'ai 4 Go de Ram, elle n'est donc pas saturée.

    Est-ce une réelle limitation de taille? Et d'où vient-elle?
    Y a-t-il un moyen d'augmenter l'espace utilisable?

    Merci pour votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Ben, si t'as 4 Go de Ram et que "Le projet déclenche la classe d'exception EOutOfRessource avec le message 'Ressource système insuffisantes'." ça veut dire que la Ram est saturée par autre chose.
    Cette autre chose peut être la mem-vive squattée par d'autres applications mais avec 4 Go il y a de la marge ou peut-être tout bêtement que ton logiciel qui n'occupe qu'environ 1,3 Go au moment de son lancement génère des fuites de mémoire qui finissent par saturer ta Ram.
    Ou bien qu'à force de "créer de grands Bitmap" ce sont eux qui saturent la Ram.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse.
    Avant je n'avais que 2 Go de mémoire et j'avais le même problème.
    J'ai aussi testé sur d'autres ordinateur et même résultat.
    J'ai créé une application avec uniquement un bouton qui cré mon bitmap 22343*22000 donc un code de 10 lignes, je ne pense donc pas qu'il puisse y avoir de fuite de mémoire. Je lance le gestionnaire de tâches windows et quand j'appuie sur le bouton, je vois que la charge dédiée sur mon PC passe de 935 Mo à 2330 Mo et mon projet de 3300 Ko à 1 447 740 Ko
    Ma RAm n'est donc pas saturée.
    Par contre si je cré un Bitmap de 22343*22000, j'obtiens une erreur.

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Re-salut,

    Ben si ton code ne fait que 10 lignes, publies le donc ici. Peut-être que quelqu'un y trouvera la cause du problème ... en tous cas on y verra plus clair ... et même si le code n'était pas en cause ça permettra au moins d'en avoir la certitude car jusqu'à présent on discute un peu dans le vide.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 743
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    Juste pour info, un bitmap 32 bits de 22343*22000 représente déjà 1.97 GB et 1.47 GB en 24 bits

    Peut-être as-tu besoin de grandes images, mais as-tu besoin d'une telle profondeur des couleurs ?

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    Voir ce sujet sur Phidels "Memoire D7", ou l'on a constaté que l'on ne pouvait allouer que 2048 Mo au maximum pour tous le programme (Mémoire des Handles Window + mémoire Programme dont RAM et Virtuelle) ce qui amène un chiffre de 1973Mo (au mieux), chiffre qui tombe au fur et à mesure que la machine reste allumée ...
    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
     
    program MaxAlloc2Go;
     
    {$R *.res}
     
    uses
      Windows,
      SysUtils;
     
    type
      TByteMatrix1024By1024 = array [0..1023, 0..1023] of Byte;
      TByteMatrix1024By1024Array = array[0..2047] of ^TByteMatrix1024By1024;
     
    var
      Tableau: TByteMatrix1024By1024Array;
      I, K: Integer;
     
    begin
      for I := 0 to 2047 do
      begin
        try
          Tableau[I] := Pointer(GlobalAlloc(GMEM_FIXED, 1024*1024));
          if Tableau[I] = nil then
            Abort;
          K := I;
        except
          on E: Exception do
          begin
            OutputDebugString(PChar(Format('Last Alloc %d', [I])));
            Break;
          end;
        end;
      end;
     
      MessageBox(0, PChar(Format('Last Alloc %d', [K])), nil, MB_OK+MB_ICONEXCLAMATION);
     
      if K = 2047 then
        OutputDebugString('Alloc 2Go');
     
      for I := K downto 0 do
        try
          // FreeMem(Tableau[I]);
          if GlobalFree(Cardinal(Tableau[I])) <> 0 then
            Abort;
        except
          on E: Exception do
            OutputDebugString(PChar(Format('Free %d : %s', [K, E.Message])));
        end;
     
     
    end.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    Re-salut,

    Ben si ton code ne fait que 10 lignes, publies le donc ici. Peut-être que quelqu'un y trouvera la cause du problème ... en tous cas on y verra plus clair ... et même si le code n'était pas en cause ça permettra au moins d'en avoir la certitude car jusqu'à présent on discute un peu dans le vide.

    A+.
    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.Button1Click(Sender: TObject);
    var BMP : TBitmap;
    begin
      BMP := TBitmap.Create;
      BMP.PixelFormat := pf24bit;
      BMP.Height := 22343;
      BMP.Width := 22000;
    end;

    Juste pour info, un bitmap 32 bits de 22343*22000 représente déjà 1.97 GB et 1.47 GB en 24 bits

    Peut-être as-tu besoin de grandes images, mais as-tu besoin d'une telle profondeur des couleurs ?
    Oui, j'ai besoin de cette profondeur.

    Citation Envoyé par ShaiLeTroll Voir le message
    Voir ce sujet sur Phidels "Memoire D7", ou l'on a constaté que l'on ne pouvait allouer que 2048 Mo au maximum pour tous le programme (Mémoire des Handles Window + mémoire Programme dont RAM et Virtuelle) ce qui amène un chiffre de 1973Mo (au mieux), chiffre qui tombe au fur et à mesure que la machine reste allumée ...
    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
     
    program MaxAlloc2Go;
     
    {$R *.res}
     
    uses
      Windows,
      SysUtils;
     
    type
      TByteMatrix1024By1024 = array [0..1023, 0..1023] of Byte;
      TByteMatrix1024By1024Array = array[0..2047] of ^TByteMatrix1024By1024;
     
    var
      Tableau: TByteMatrix1024By1024Array;
      I, K: Integer;
     
    begin
      for I := 0 to 2047 do
      begin
        try
          Tableau[I] := Pointer(GlobalAlloc(GMEM_FIXED, 1024*1024));
          if Tableau[I] = nil then
            Abort;
          K := I;
        except
          on E: Exception do
          begin
            OutputDebugString(PChar(Format('Last Alloc %d', [I])));
            Break;
          end;
        end;
      end;
     
      MessageBox(0, PChar(Format('Last Alloc %d', [K])), nil, MB_OK+MB_ICONEXCLAMATION);
     
      if K = 2047 then
        OutputDebugString('Alloc 2Go');
     
      for I := K downto 0 do
        try
          // FreeMem(Tableau[I]);
          if GlobalFree(Cardinal(Tableau[I])) <> 0 then
            Abort;
        except
          on E: Exception do
            OutputDebugString(PChar(Format('Free %d : %s', [K, E.Message])));
        end;
     
     
    end.
    Merci pour ce lien. J'ai bien peur de ne pas avoir de solution. J'ai essayé avec FastMM4 mais pas d'amélioration.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 522
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 522
    Points : 25 052
    Points
    25 052
    Par défaut
    FastMM4 n'améliore les choses que sous un Win64 pour le taille maximale que l'on peut allouer par process avec Delphi 7

    Sinon, je pense qu'il est temps pour toi de te plonger dans ce qu'un un fichier bitmap, et de la manipuler avec les API Windows pour ce qui est de la partie "entête" (le DIB, je crois), mais tous le reste, il faudrait le manipuler autrement, peut-être directement dans le fichier (ou par un fichier intermédiaire) ... PhotoShop par exemple ne charge pas tout le fichier en mémoire, il utilise un cache sur le disque (rien est pire que le SWAP, mieux vaut manipuler un gros tableau d'un 1Go sur le disque soit même directement que de vouloir utiliser que de la mémoire vive et laisser faire windows qui swappe n'importe quand pour n'importe quoi, cela se voit sur les ré-allocation de tableau, où après une certaine taille, cela devient plus lent que d'écrire dans un fichier, ceci est valable pour le gestionnaire mémoire de D7, FastMM améliore le choses à ce sujet, il me semble ...)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    FastMM4 n'améliore les choses que sous un Win64 pour le taille maximale que l'on peut allouer par process avec Delphi 7

    Sinon, je pense qu'il est temps pour toi de te plonger dans ce qu'un un fichier bitmap, et de la manipuler avec les API Windows pour ce qui est de la partie "entête" (le DIB, je crois), mais tous le reste, il faudrait le manipuler autrement, peut-être directement dans le fichier (ou par un fichier intermédiaire) ... PhotoShop par exemple ne charge pas tout le fichier en mémoire, il utilise un cache sur le disque (rien est pire que le SWAP, mieux vaut manipuler un gros tableau d'un 1Go sur le disque soit même directement que de vouloir utiliser que de la mémoire vive et laisser faire windows qui swappe n'importe quand pour n'importe quoi, cela se voit sur les ré-allocation de tableau, où après une certaine taille, cela devient plus lent que d'écrire dans un fichier, ceci est valable pour le gestionnaire mémoire de D7, FastMM améliore le choses à ce sujet, il me semble ...)

    Merci beaucoup. Je vais donc changer ma manière de gérer mes images.

  10. #10
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 173
    Points
    4 173
    Par défaut
    Il faut savoir que du fait du mode de gestion de la mémoire des Windows 32 bits, chaque processus à une limitation d'adressage à 2 Go.

    Peu importe que la machine possède 4 Go, aucune application ne peut s'allouer plus de 2 Go de mémoire.
    Par contre, plusieurs applications peuvent utiliser 2 Go chacune...(et la on profite des n Go que Windows voudra bien détecter).

    Il est possible de relever cette limitation à 3 Go, en ajoutant le switch /3GB au démarrage de windows (dans le fichier boot.ini).

    Cependant, je ne pense pas que ce soit un problème de mémoire vive. Tu aurrais dû avoir une erreur EOutOfMemory et non pas EOutOfRessource.
    Je pense plutôt que c'est le GDI qui rend l'âme pour gérer une image de cette taille.

    Ca ne change pas grand chose. Le résultat est le même. Il faut effectivement que tu gères tes images différemments.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Mars 2007
    Messages : 91
    Points : 95
    Points
    95
    Par défaut

    peut être que si tu jette un coup d'oeil sur cette source tu trouveras ton bonheur newik01 Big Bitmap Loader Sample v.1.0 "This sample application can load a bigmap of 2GB in only 100KB of memory."
    bonne chance tt le monde.

Discussions similaires

  1. Taille maximale en mémoire
    Par Shayä dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2010, 16h33
  2. Taille maximale d'un package
    Par haugoyard dans le forum Oracle
    Réponses: 2
    Dernier message: 09/08/2005, 16h27
  3. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  4. Réponses: 9
    Dernier message: 29/07/2003, 14h41

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