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 :

File of, File ou Stream ?


Sujet :

Langage Delphi

  1. #1
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 192
    Points : 126
    Points
    126
    Par défaut File of, File ou Stream ?
    Bonjour à tous,
    Le contexte : j'ai construit une application utilisant plusieurs fichiers séquentiels genre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TEnregistrement=Record
        Champ1:String[10];                      
        Champ2:String[20];                   
        Champ3:String[50];                     
        Champ4:String[100];
    Très bien jusqu'au moment ou je tombe sur ce tutoriel sur les fichiers https://fbeaulieu.developpez.com/guide/?page=page_13 qui me fait prendre conscience que dans mes fichiers, je n'utilise quasiment jamais la totalité de la place prise par les champs et qu'il y a donc moyen de réduire la taille des champs à la longueur réelle de l'information contenue (partie sur les fichiers binaires de cet article)

    Super, et je me dis que je vais pouvoir en profiter pour ajouter en tête de fichier un certain nombre d'information (par exemple la date et heure du dernier accès au fichier), information qui n'a rien à faire dans les champs du fichier ...

    Et puis je tombe sur les Streams, entre autre https://delphi.developpez.com/faq/?p...classe-TStream

    Et du coup ... je ne sais pas quoi choisir comme méthode! J'ai bien cherché des comparatifs, mais sans grand succès.

    Mon objectif est :
    - avoir une structure de fichier la plus compacte possible (pas de blanc pour remplir des zones non utilisée : par exemple 'BONJOUR' dans le champs4 (String[100]) donne 93 octets vides!
    - Pouvoir écrire/lire des informations avant les enregistrements
    - je ne gère que des type strings (en réalité shortstring), rien d'autre.
    - Rapidité d'accès à un enregistrement

    Vous pouvez m'aider à débroussailler le foutoir ?
    Delphi 11 - Lazarus
    Utilisation de la VCL

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 330
    Points
    11 330
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Pour ma part, hors l'utilisation d'une BDD locale type SQLite, je pense que je me dirigerais vers un TStringList avec ses méthodes SaveToFile et LoadFromFile. Je réserverais la 1ère ligne, d'indice 0 pour mes infos, encodées en base64. Les n champs du ième TRecord seraient donc les lignes d'indices i*n+1 à i*n+n.
    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 !

  3. #3
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 192
    Points : 126
    Points
    126
    Par défaut
    Une précision sur l'idée de la taille d'un fichier :
    10 Mo au minimum
    20 000 enregistrements au minimum contenant 51 champs
    Delphi 11 - Lazarus
    Utilisation de la VCL

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je pensais avoir répondu mais les aléas du travail ont dû faire que je ne l'ai pas fait. Maintenant que le volume des données est défini c'est encore plus facile.
    Le fichier séquentiel avec 20000 enregistrements et une contrainte de rapidité d'accès ça me paraît compromis.
    Sinon ce qui est décrit n'est ni plus ni moins qu'un fichier CSV de longueur variable
    ajouter en tête de fichier un certain nombre d'information (par exemple la date et heure du dernier accès au fichier),
    ça c'est inutile il s'agit déjà de propriétés de fichier que l'on peut obtenir.
    Reste la question de traitement des données s'il s'agit uniquement de données qui ne seront pas traitées (i.e sélection selon la valeur d'une colonne) aucun problème. Si par contre il s'agit de pouvoir faire des recherches de données le même problème que la rapidité d'accès va se poser.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 192
    Points : 126
    Points
    126
    Par défaut
    Arfff, ce n'était qu'un exemple l'info de la dernière ouverture ... en fait il y a diverses infos concernant ce fichier que j'aimerai mettre en tête du fichier.
    Le fichier est en fait un fichier d'écritures comptables ... donc, oui, il y a des recherches et des modifications, et des suppressions.
    Dans ma version de base (fichier séquentiel) je me sers d'une Stringgrid qui accueille tout le fichier lors de l'ouverture du dossier et je manipule la StringGrid (du coup l'idée du fichier type CSV est pertinente)

    Mais en lisant des articles sur les Stream, j'ai l'impression que je peux faire plus rapide et plus efficace en travaillant directement à partir du fichier sans passer par une StringGrid.
    Pour le moment, je balance du coté des Streams, mais mes tests merdent complètement : je suis parti de l'exemple (dans la conclusion de l'article on peut télécharger le projet) https://flash-koti.developpez.com/ar...4-tfilestream/. Mais si on édite son fichier test.zio avec un editeur hexa et qu'on regarde la partie String, on se rend compte que chaque caractères prend 2 octets et non 1, du coup length(chaine) ne réserve pas suffisamment de place et la chaine est tronquée à sa moitié!

    Plouf plouf ... je patauge
    Delphi 11 - Lazarus
    Utilisation de la VCL

  6. #6
    Membre confirmé
    Avatar de alheuredudejeuner
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 376
    Points : 632
    Points
    632
    Billets dans le blog
    4
    Par défaut dommage pour les en-têtes
    Bonjour

    sinon avec ado, on peut lire les fichier texte en requêtant comme sur une base de données en lecture.

    Pour l'écriture je ne l'ai pas fait, ce n'était peut-être pas possible en écriture.

    Ce qui serait cool, c'est de l'avoir avec Firedac.

    Cordialement

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    file ou TFileStream, c'est juste une question d'API car au final ça revient au même, ce sont les mêmes fonctions d'accès aux fichiers qui seront utilisées.

    par contre entre un record à taille fixe et un enregistrement compacté c'est pas la même chose. Si tu veux accéder au nième enregistrement, dans le premier cas c'est "SizeOf(Record) * n" et c'est bon, dans le second cas tu as contraint d'avoir une table d'index qui te donne la position dans le fichier de chaque enregistrement. Par ailleurs, ajout/suppression en record statique c'est facile, tu peux noter un record supprimé et le réutilisé pour stocker un autre...avec des données de taille variable ce n'est pas toujours possible.

    pour la rapidité d'accès il existe aussi le File Mapping qui permet de faire correspondre un espace disque avec un espace mémoire.

    après, si les données au total tiennent en mémoire, tu peux te contenter d'une lecture écriture de flux, y compris avec compression si tu veux un truc tout petit mais un peu moins rapide.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 085
    Points : 15 510
    Points
    15 510
    Billets dans le blog
    9
    Par défaut Fichier d'enregistrements de taille variable
    Bonjour ! Vous pourriez être intéressé par cet exemple.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    Membre habitué

    Homme Profil pro
    Direction financière et formateur en gestion et contrôle de gestion
    Inscrit en
    Mai 2003
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Direction financière et formateur en gestion et contrôle de gestion
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2003
    Messages : 192
    Points : 126
    Points
    126
    Par défaut
    Pour le soucis des fichiers ne contenant que la moitié des infos car les caractères sont codés sur 2 octets et non sur 1 la réponse est ici : https://www.developpez.net/forums/d1...eres-bizarres/

    Roland, c'est ton article qui a été le déclencheur de tout

    ADO ... il me semblait qu'on avait des composants ... qui n'ont plus l'air d'être là (Delphi 10.2)

    ok compris pour le reste : des choix et des compromis (pour les 10 ans à venir!)
    Delphi 11 - Lazarus
    Utilisation de la VCL

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 091
    Points : 41 069
    Points
    41 069
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par patrice@ Voir le message
    Dans ma version de base (fichier séquentiel) je me sers d'une Stringgrid qui accueille tout le fichier lors de l'ouverture du dossier et je manipule la StringGrid (du coup l'idée du fichier type CSV est pertinente)
    pertinente pour du stockage de base ou de l'échange de données, digne des années cartes perforées. Un simple indicateur en debut de ligne permettant de savoir de quel type d'information il s'agit
    i.e 0 - informations générales
    1- écritures
    2- information optionnelle pour l'écriture

    Mais si on édite son fichier test.zio avec un editeur hexa et qu'on regarde la partie String, on se rend compte que chaque caractères prend 2 octets et non 1,
    c'est l'avènement de l'Unicode depuis D2009 String un une chaine Unicode (soit, en gros : 2 octets pour un char) pour "retrouver" quelque chose des années ante-unicode (un char=un Octet) il faut
    utilisé des AnsiString

    À mon avis vous voulez réinventer une roue qui a un nom : ISAM (roue utilisée par nombre de SGBD). Il serait certainement temps de sauter le pas ?

    Quand j'ai lu pour la première fois votre demande, ma première réponse commençait par : je suis étonné de voir quelqu'un préoccupé par "l'économie d'octets" à notre époque c'est devenu rare ! Cette chasse aux octets, typique des années 70-80 (que ce soit pour le stockage de données ou pour la mémoire utilisée) n'est plus vraiment d'actualité même celle de l'utilisation de la CPU semble devenue obsolète laissant la place à la meilleure utilisation des multi cœurs et la fuite mémoire.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Membre actif
    Homme Profil pro
    libre
    Inscrit en
    Juin 2019
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : libre

    Informations forums :
    Inscription : Juin 2019
    Messages : 205
    Points : 292
    Points
    292
    Par défaut
    regarde sur cette petite base de donnée ici

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 20/02/2015, 13h46
  2. Réponses: 4
    Dernier message: 22/06/2012, 15h19
  3. Entre CStr et ToString, mon coeur balance
    Par Kropernic dans le forum VB.NET
    Réponses: 12
    Dernier message: 27/06/2011, 10h25
  4. Entre SB64 et SB128 mon coeur balance
    Par ludosoft dans le forum Composants
    Réponses: 3
    Dernier message: 24/08/2007, 08h40
  5. Entre L'api Win32 et SDL mon coeur balance
    Par mechouille dans le forum API graphiques
    Réponses: 16
    Dernier message: 13/12/2006, 16h01

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