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 :

Longueur d'une AnsiString


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 179
    Par défaut Longueur d'une AnsiString
    Bonjour à tous,

    Dans la doc trouvée là, je peux lire :
    Ansistrings are strings that have no length limit.
    Sauf que, j'ai créé un tout petit bazar pour mettre en évidence que je ne peux pas monter à 1,4 Go --> erreur "out of memory" (1,3 ça passe, je n'ai pas creusé pour trouver exactement où ça coince) :
    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
    var
      ln: int64 = 1000000000; // 1 Go
     
    procedure TMainForm.ButtonTestClick(Sender: TObject);
    var
      s: ansistring;
    begin
      SetLength(s, ln);
      ShowMessage(IntToStr(Length(s)));
      SetLength(s, 10); // pour libérer
    end;
     
    procedure TMainForm.ButtonPlusClick(Sender: TObject);
    begin
      ln := ln + 100000000; // + 100 Mo
    end;
     
    procedure TMainForm.ButtonMoinsClick(Sender: TObject);
    begin
      ln := ln - 100000000; // - 100 Mo
    end;
    Lorsque le ShowMessage affiche 1,3 Go, le "moniteur de ressources" de 7 me dit que la mémoire utilisée par le processus est de 997 Mo (ça descend doucement), et la mémoire disponible de 958 Mo (et ça monte doucement).

    Une idée pour pouvoir avoir une Ansistring de 5 ou 6 Go ?

    Bonne journée,

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 467
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 467
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Une idée pour pouvoir avoir une Ansistring de 5 ou 6 Go ?
    Euh quelle est l'utilité ? Ou plutôt qu'est-ce que tu veux faire ? Il y a surement une autre façon de faire ce que tu souhaites...

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 179
    Par défaut
    Yop !
    Citation Envoyé par wormful_sickfoot Voir le message
    Euh quelle est l'utilité ? Ou plutôt qu'est-ce que tu veux faire ?
    Et bien, je veux extraire des fichiers depuis un .zip. Je me suis inspiré de ça, trouvé dans "Zippit.pas" :
    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
    procedure TZippit.AddFile(const Name: String);
    var
      F: TFileStream;
      B: String;
    begin
      F := TFileStream.Create(Name, fmOpenRead);
      try
        SetLength(B, F.Size);
        F.ReadBuffer(B[1], F.Size);
        inherited AddFile(Name, 0);
        Data[Count-1] := B;
      finally
        F.Free;
      end;
    end;
    pour écrire ça :
    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
    procedure TZippit.ExtractFile(const i: integer; const Name: String;
      const l: int64);
    var
      F: TFileStream;
      B: AnsiString;
    begin
      F := TFileStream.Create(Name, fmCreate);
      try
        SetLength(B, l); // run error 203 si gros fichiers :-( mais ok sur petits... 
        B := Uncompressed[i]; // dans SciZipFile.pas, qui tape ensuite dans dzlib.pas
        F.WriteBuffer(Pointer(B)^, l);
      finally
        F.Free;
      end;
    end;
    Citation Envoyé par wormful_sickfoot Voir le message
    Il y a surement une autre façon de faire ce que tu souhaites...
    Je m'en doute un peu (faire le boulot blocks par blocks, style 1 Mo à la fois), mais je vais misérer grave, je sens...

    Ah, je précise que mes fichiers .zip d'origine sont créés avec 7z, car en regardant le code de AddFile ci-dessus, je me dis que je ne pourrai jamais zipper des gros fichiers, le problème d'allocation mémoire serait le même

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Qia,

    Je pense que tu prends un mauvais chemin, ne serait-ce que parce que tu te heurteras forcément à la limite de mémoire disponible, quelle que soit la quantité installée (il suffira pour ça que tu veuilles gérer de plus gros fichiers).

  5. #5
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    alors comment ça marche une ansistring

    c'est une sorte de buffer en mémoire dont la taille n'est pas accessible directement (à moins de pointer qq octets avant le début) et qui est alloué à la volée quand on fait une assignation ou un setlength. De plus, il faut savoir que quand on fait change la longueur, le gestionnaire de mémoire alloue la nouvelle taille demandée, copie le contenu de l'ancienne zone dans la nouvelle et efface l'ancienne.

    La taille mémoire d'un poste n'est pas extensible à l'infini, de plus il faut laisser de la place pour les autres. D'où il ressort :
    - travaille en boucle,
    - trouve une taille de buffer intermédiaire que tu ne changerad pas toutes les 3ms (car oui copier des blocs mémoire ça prend du temps) (1Mo c'est bien)


    PS 1ko=1024 octets donc 1Go ce n'est pas 1000000000 octets dans le monde des programmeurs (ce que tu utilises, c’est la notation des marchands de disque dur qui nous enfument mais ceci est un autre sujet)

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 179
    Par défaut
    Re,
    Citation Envoyé par mtournay Voir le message
    (...)D'où il ressort :
    - travaille en boucle,
    - trouve une taille de buffer intermédiaire que tu ne changerad pas toutes les 3ms (car oui copier des blocs mémoire ça prend du temps) (1Mo c'est bien)
    Oui, je me doutais bien de tout ça, je voulais juste me l'entendre confirmer...
    Je vais donc envisager un buffer intermédiaire, mais comment ça va se passer au niveau de la décompression ?
    Si j'envoie un buffer de 1 Mo de données et que le système de décompression a besoin de données qui sont après ce 1 Mo ? (je ne sais pas trop comment fonctionne le système de décompression...)
    Bref, je suis pas rendu, à moins que quelqu'un ait déjà joué avec tout ça (Lazarus ou Delphi) pour me mettre sur la voie...

    Citation Envoyé par mtournay Voir le message
    PS 1ko=1024 octets donc 1Go ce n'est pas 1000000000 octets dans le monde des programmeurs (ce que tu utilises, c’est la notation des marchands de disque dur qui nous enfument mais ceci est un autre sujet)
    Yes, I know, mais c'était pour faire simple,

    Bon week-end,

  7. #7
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Mau,
    Citation Envoyé par mtournay Voir le message
    PS 1ko=1024 octets donc 1Go ce n'est pas 1000000000 octets dans le monde des programmeurs (ce que tu utilises, c’est la notation des marchands de disque dur qui nous enfument mais ceci est un autre sujet)
    Mais si !

    Pour parler de Ko, Mo, Go ... au sens habituel des informaticiens, la norme est d'écrire Kio, Mio, Gio ..., justement pour lever l'ambiguïté créée par nos habitudes.

    Mais dans le contexte, je crois que la valeur désirée devrait effectivement être en Gio, donc 1024*1024*1024 = 1*073*741*824

  8. #8
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Citation Envoyé par droggo Voir le message
    Mau,

    Mais si !

    Pour parler de Ko, Mo, Go ... au sens habituel des informaticiens, la norme est d'écrire Kio, Mio, Gio ..., justement pour lever l'ambiguïté créée par nos habitudes.

    Mais dans le contexte, je crois que la valeur désirée devrait effectivement être en Gio, donc 1024*1024*1024 = 1*073*741*824
    Je ne reconnais pas cette notation de marchand de tapis ....

    sifflote (j'ai rien contre les vrais marchand de tapis hein )

  9. #9
    Membre éprouvé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Si j'envoie un buffer de 1 Mo de données et que le système de décompression a besoin de données qui sont après ce 1 Mo ? (je ne sais pas trop comment fonctionne le système de décompression...)
    mhhhh dans mon idée, l'ansistring est passé var, la routine de décompression delete du début de cette chaine ce qu'elle a pu décompresser, et donc te laisse à disposition qqchose qu'elle n'a pas compris. Toi tu lis ton Mo (oui oui Mo ) supplémentaire à la suite et ainsi de suite

    en gros

    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
     
     
    Function Lecture(const TailleALire: integer; var TailleLue: integer):string;
    begin
      .
      .
    end;
     
    Procedure Decompression(var s: string);
    begin
      .
      .
      delete(s,1,taille de ce que j ai réussi à décompresser);
    end;
     
    begin
      s := '';
      repeat
        s += lecture(1Mo, readen);
        decompression(s)
      until readen<>1Mo
    end;
    bon c'est du pseudo code, faut boucher les trous mais l'idée est la, j'y connais pas grand chose en décompression.

  10. #10
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 977
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 977
    Par défaut
    Goa,
    Citation Envoyé par mtournay Voir le message
    Je ne reconnais pas cette notation de marchand de tapis ....

    sifflote (j'ai rien contre les vrais marchand de tapis hein )
    Mais les marchands de tapis sont puissants, et ont décidé qu'il s'agit de la notation officielle des kilos façon informatique.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Amusante, cette histoire de "marchands de tapis". J'avais lu cela. Personnellement, j'aime bien l'approche 2^10... Il faut également se rappeler que l'informatique, c'est pour une bonne part des normes américaines... qui ont toujours eu des problèmes avec le système métrique "usuel". "Métrifieraient"-ils ?

    Cordialement. Gilles
    Dernière modification par Invité ; 29/06/2011 à 00h34.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 179
    Par défaut
    Citation Envoyé par mtournay Voir le message
    mhhhh dans mon idée, l'ansistring est passé var, la routine de décompression delete du début de cette chaine ce qu'elle a pu décompresser, et donc te laisse à disposition qqchose qu'elle n'a pas compris. Toi tu lis ton Mo (oui oui Mo ) supplémentaire à la suite et ainsi de suite
    (...)
    bon c'est du pseudo code, faut boucher les trous mais l'idée est la, j'y connais pas grand chose en décompression.
    Salut, et merci de ton soutien, mais j'abandonne (ce n'était qu'un projet perso), je sens venir des misères et des galères à n'en plus finir, déjà que je passe des heures à adapter des projets Delphi, mais là, la dernière en date m'achève :

    dans un projet Delphi trouvé sur le web et que je veux étudier, impossible de le compiler il manque toujours quelque chose et le pire c'est quand sur une ligne le compilo me dit « Error: identifier not found "un_identifieur" » et qu'après avoir rajouté ce qu'il faut dans struct.inc il me redit la même chose alors qu'en mettant la souris sur un_identifieur l'infobulle me montre bien la définition que j'ai rajoutée et qu'en faisant « Ctrl-Clic » je vais sur la définition, ben pour moi, là c'est trop...
    Bien sûr c'est pareil en enregistrant tout puis fermeture et réouverture de l'EDI.

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

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 946
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    As-tu essayé avec la directive {$mode objfpc}{$M+} ?

    Sur les bons conseils de ce forum, ça m'a permis de lever un comportement similaire.

    Bon code.
    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 !

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 179
    Par défaut
    Salut, Yves,
    Citation Envoyé par tourlourou Voir le message
    As-tu essayé avec la directive {$mode objfpc}{$M+} ?
    C'est pire...

    Bon, de toute façon, si je recopie struct.inc dans le dossier du projet, que j'y ajoute la définition nécessaire, que je mets la directive {$I struct.inc} et que l'edi ne fait pas l'inclusion après avoir modifié dans les chemins des options du projet de prendre en compte ce chemin, moi je dis "merdum" !

    Plus le fait que hier, quand je faisais "Projet / Options / Chemins", et que je choisissais un chemin puis [ OK ], ben celui-ci n'était pas recopié dans la zone "Inclusions des fichiers" !
    Il a fallu que je ferme l'edi, que je change de projet et que j'y retourne pour que ça veuille bien l'afficher. Absolument incroyable...

Discussions similaires

  1. Longueur d'une extension > 3 caractères
    Par Rodrigue dans le forum Windows
    Réponses: 5
    Dernier message: 10/06/2005, 20h58
  2. [langage] longueur d'une chaine lue ds un fichier
    Par perlaud dans le forum Langage
    Réponses: 6
    Dernier message: 30/06/2004, 23h36
  3. Réponses: 2
    Dernier message: 30/03/2004, 12h31
  4. Convertir une AnsiString en hexadecimal
    Par manathan01 dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/12/2002, 10h27
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 19h31

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