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

Lazarus Pascal Discussion :

Taille de la mémoire du PC [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 30
    Points
    30
    Par défaut Taille de la mémoire du PC
    Bonjour,

    Je souhaiterais connaitre la taille mémoire du PC 2Go, 3Go, 4Go ou plus.
    J'ai essayé TMemoryInfo de delphi, mais ca ne semble pas implémenté sous lazarus et fpc.

    Comment puis-faire, au démarrage de mon programme, pour connaitre la taille totale du PC ?

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 448
    Points
    15 448
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    J'ai trouvé la chose suivante. Si quelqu'un pouvait traduire le texte en français, ce serait bien. Pour ma part je ne sais pas ce que veut dire paging file.

    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
     
    (* http://www.greatis.com/delphicb/tips/lib/systemifo-memorysysinfo.html *)
     
    program MemoryStatus;
     
    uses
      Windows, SysUtils;
     
    var
      s: TMemoryStatus;
     
    begin
      s.dwLength := SizeOf(s);
      GlobalMemoryStatus(s);
      WriteLn(s.dwMemoryLoad, '% memory in use');
      WriteLn(s.dwTotalPhys / 1024:0:0, ' Kb of physical memory');
      WriteLn(s.dwAvailPhys / 1024:0:0, ' Kb of available physical memory');
      WriteLn(s.dwTotalPageFile / 1024:0:0, ' Kb that can be stored in the paging file');
      WriteLn(s.dwAvailPageFile / 1024:0:0, ' Kb available in the paging file');
      ReadLn;
    end.
    31% memory in use
    3627272 Kb of physical memory
    2499292 Kb of available physical memory
    4194304 Kb that can be stored in the paging file
    3067092 Kb available in the paging file
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 448
    Points
    15 448
    Billets dans le blog
    9
    Par défaut
    D'après ce que je viens de lire ici et là, sur les machines récentes il vaudrait mieux utiliser la fonction GlobalStatusMemoryEx. Il semble que la fonction ne soit pas disponible dans l'unité Windows de Free Pascal, et qu'il faille aller la chercher dans une DLL. J'ai trouvé un exemple Delphi qui fonctionne avec Free Pascal (l'exemple qui est au bas de la page).

    Calling GlobalMemoryStatusEx
    ============================
    Memory Load: 40%
    Total Physical: 3627272 Kb
    Avail Physical: 2172196 Kb
    Total Page File: 4282632 Kb
    Avail Page File: 2577984 Kb
    Total Virtual: 2097024 Kb
    Avail Virtual: 2040052 Kb
    P.-S. Je constate que dans mon cas les résultats des deux fonctions concordent.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 852
    Points : 11 285
    Points
    11 285
    Billets dans le blog
    6
    Par défaut
    Hello !

    Si je ne me fourvoie pas, Windows réserve de l'espace disque pour y cacher de la mémoire paginée dans un fichier système, lui permettant de simuler une mémoire vive virtuelle plus grande que celle physique disponible.

    Et la mémoire virtuelle (Total Virtual) correspond à celle adressable par le processus.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 069
    Points : 15 448
    Points
    15 448
    Billets dans le blog
    9
    Par défaut
    Bonjour Yves !

    D'accord, je vois. Merci pour l'éclaircissement.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Windows est indispensable ?
    Car dans mon cas ca doit fonctionner avec windows et avec linux.

  7. #7
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Points : 53
    Points
    53
    Par défaut
    Bonsoir,

    2 Sections une fonction GetSystemMem.

    Malheureusement, je n'ai pas de linux sous la main.
    Mais de souvenir on trouve l'information dans /proc/meminfo.

    Je composé un code vite fait. J'ai pas testé.
    Mais cela devrait vous aider.

    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
    {$IFDEF LINUX}
    function GetSystemMem: string;  
     var GetInfo : TStringlist;
     
    begin
     GetInfo := TStringlist.Create;
     GetInfo.LoadFromFile(' /proc/meminfo');
     Result := GetInfo.Text;
    end;
    {$ELSE}
    function GetSystemMem: string;  
    VAR MS_Ex : MemoryStatus;
    begin
     FillChar (MS_Ex, SizeOf(MemoryStatus), #0);
     MS_Ex.dwLength := SizeOf(MemoryStatus);
     GlobalMemoryStatus (MS_Ex);
     Result:= IntToStr(Round(MS_Ex.dwTotalPhys / 1073741824))+ ' GB';
    end;
    {$ENDIF}

    Cldt.
    Iwoks

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Super. Merci.
    J'en conclu que je vais devoir faire du code adapté aux deux os.

    L'idée c'est à l'ouverture d'une image, en fonction de la taille de l'image et de la mémoire du PC avertir l'utilisateur que ca va swapper dur et que les temps de traitements pourraient devenir pharaonique.
    J'ai choisi l'option de verifier la memoire du pc.
    Une autre option existerait en mettant d offie un warning expliquant les risques si le pc n'a que 4Go. Mais du coup meme si le pc a 8Go l avertissement apparaitrait.
    Pensez vous que ce soit génant ?

  9. #9
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Je comprends, le problème est gênant si le PC n'a que 2Go Ram et qu'il faut alloué 8Go.
    Le soucis, en faite c'est pas de savoir qu'elle RAM à la machine, mais plus tôt combien de Ram il reste.
    Je ne sais comment vous allez chargé l'image en << mémoire >>.

    A mon avis :
    Une technique qui existe, est d'allouée le maximum de mémoire pour le programme. Et après Swapper.
    Ou encore, il faut donc gérer des sections de mémoire de manière TThread.
    Lorsque vous arrivez a certains nombre de bloque restant déclencher un événement.
    << Qui précise attention le niveau maximum d'exploitation de mémoire RAM est atteint Swap activé. >> Un truc du genre.

    Il faut aussi gérer les exceptions en cas de << Out Of Memory >>.

    Votre projet semble très intéressant.

    Cldt.
    F.THERET

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Merci IWorks.
    Au lancement de Tim j'aloue la place mémoire nécessaire aux traitements interne des images sauf dans un cas où j'utilise une liste chaînée.
    Je gère les erreurs d'allocation.
    Mais je ne gère pas les TImages qui permettent d'afficher les images (par exemple avant traitement et après traitement).
    Du coup pour les grosses images et les petites RAM le PC se met à swapper dur et semble se figer. C'est le cas avec 4Go de RAM pour des images de 175 Mega Pixels et plus.
    Je ne souhaite pas non plus faire trop de code specifique windows/linux (il y en a deja pour l accès direct à la zone mémoire des TImages.

    Du coup j'ai fais simple : Après le chargement de l'image source dans le premier TImage j'en récupère le nombre de pixels. Si celui-ci est supérieur ou égal à 150 Méga pixels, j'affiche une popup d'avertissement.

    Une fois qu'il aura à nouveau la main l'utilisateur pourra abandonner ou tenter malgré tout de traiter son image. Avec 4Go de RAM il aura le temps d'aller se prendre un demi au café du coin. Mais il aura été prévenu. Avec la version 64bits j'ai fais des tests avec des images de 200 Mega pixels (on s'enquiquine dur, mais le soft fait le boulot).

    En tout cas merci à tous pour votre aide.

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 718
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 718
    Points : 15 098
    Points
    15 098
    Par défaut
    Citation Envoyé par leneant Voir le message
    (...) Du coup j'ai fais simple : Après le chargement de l'image source dans le premier TImage j'en récupère le nombre de pixels. Si celui-ci est supérieur ou égal à 150 Méga pixels, j'affiche une popup d'avertissement.
    Il me semble que certaines librairies permettent de récupérer les dimensions de l'image sans charger le fichier dans un TImage : parce que ce n'est plus la peine, àmha, d'informer l'utilisateur que ça va ramer une fois que ça a déjà commencé à ramer,

    Pour connaître l'espace libre sous Linux, j'utilise ça (stb = StatusBar en mode simple texte simple panel) :
    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
    procedure Split(const Delimiter: Char; Input: string; const Strings: TStrings);
    begin
       Assert(Assigned(Strings)) ;
       Strings.Clear;
       Strings.Delimiter := Delimiter;
       Strings.DelimitedText := Input;
    end;
     
    procedure GetMemory(var st: TStringList);
    var
      s1, s2: string;
      stTmp: TStringList;
    begin
      st.Clear;
      st.LoadFromFile('/proc/meminfo');
      if st.Count > 0 then
      begin
        stTmp:= TStringList.Create;
        Split(' ', st[0], stTmp);
        s1 := stTmp[1];
        stTmp.Clear;
        Split(' ', st[1], stTmp);
        s2 := stTmp[1];
        stTmp.Free;
        st.Clear;
        st.Add(s1); // total
        st.Add(s2); // free
      end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      infototal, infolibre : double;
      stList: TStringList;
      s1 : string = ' Mémoire physique disponible : ';
      s2 : string = ' octets sur ';
      s3 : string = ' octets totaux, soit ';
      s4 : string = ' % libre. ';
    begin
      stList:= TStringList.Create;
      GetMemory(stList);
      if stList.Count > 0 then
      begin
        infototal := StrToFloat(stList[0]);
        infolibre := StrToFloat(stList[1]);
        stb.SimpleText := s1 + Format('%.0n', [infolibre]) + s2 + Format('%.0n', [infototal])
          + s3 + FloatToStrF(((100 * infolibre) / infototal), ffFixed, 3, 0) + s4;
      end;
      stList.Free; 
    end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème de taille et de mémoire
    Par soria_t dans le forum C
    Réponses: 31
    Dernier message: 22/02/2007, 08h58
  2. Quelle est la taille de la mémoire allouée à la JVM ?
    Par emie31 dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 12/11/2006, 21h42
  3. Réponses: 5
    Dernier message: 08/11/2006, 11h41
  4. Taille de la mémoire pointée par un pointeur
    Par Tex-Twil dans le forum C
    Réponses: 9
    Dernier message: 09/10/2006, 14h27
  5. [9i] Estimer la taille de la mémoire
    Par Débéa dans le forum Oracle
    Réponses: 4
    Dernier message: 08/03/2006, 17h25

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