Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2061 connectés 

  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Ecrire dans un fichier avec TFileStream...

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecrire dans un fichier avec TFileStream...

n°924451
Inekman
Posté le 15-12-2004 à 21:01:31  profilanswer
 

Bonsoir les amis,
 
Une question me taraude :pt1cable:  
 
J'ai une procédure qui créée un fichier en lisant un autre fichier. Ceux-ci sont généralement de grande tailles (> 100 Mo). La question que je me pose est la suivante :
 
jusqu'à présent, je faisais un truc dans ce genre :
 
1. Créer le fichier Destination,
2. Ecrire 15 Mo de données depuis Source vers Destination,
3. Fermer Source et Destination.
 
Donc en fait, mon fichier est créé par bloc de 15 Mo.  
 
En lisant quelques codes sources sur le net, j'ai remarqué que beaucoup (une majorité) effectuaient l'opération d'écriture par paquet de 8 ko ou 16ko dans une boucle Tant Que. Cela leur permet d'avoir une visualation précise de l'état d'avancement de la création du fichier.
 
Concrètement, est-il plus intéressant (optimisation) d'écrire les données d'un fichier par paquet à l'aide d'une boucle ou alors de faire un truc direct du genre DestinationStream.CopyFrom(SourceStream, 15000000);
 
Moi j'utilise la 2ème méthode et donc la progression indiquant la création du fichier s'effectue par bloc de 15 Mo et donc ça fait des gros jump du style 2%...20%...33%...41%...etc. [:airforceone]  
 
Si un épai brouillard se trouve entre mon post et vos yeux et que vous n'avez rien compris, dites-moi, j'ai les feux anti-brouillard, j'éclairerai votre route. :hello:
 
Merci à vous.


Message édité par Inekman le 15-12-2004 à 21:02:29
mood
Publicité
Posté le 15-12-2004 à 21:01:31  profilanswer
 

n°924459
antp
Super Administrateur
Champion des excuses bidons
Posté le 15-12-2004 à 21:08:08  profilanswer
 

À mon avis ça ne change pas grand chose aux perfs, par contre ce que tu peux faire c'est donner au stream de destination la taille finale (Dest.Size := Source.Size) avant de copier, puis ensuite revenir au début du fichier et faire la copie.
Ça évite la fragmentation en NTFS (mais il faut vérifier qu'en FAT32 il ne fasse pas l'andouille en voulant remplir le fichier de vide...)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°924651
Inekman
Posté le 16-12-2004 à 00:21:01  profilanswer
 

ouep g fait des tests et la durée de l'opération est très sensiblement la même. La seule différence, c'est qu'avec un petit buffer la visualisation de la progression est très précise. J'ai choisi 64 ko comme buffer, c ni trop gros ni trop petit et ça marche plutôt bien.
 
Mais maintenant un autre problème me chiffonne.
 


type
    THeader = class
    private
        FLogiciel: String[17];
    public
        property Logiciel: String read FLogiciel write FLogiciel;
    end;


 
Mr Delphi ne veut pas compiler et me dit ceci :
 

[Error] U_Header.pas(18): Incompatible types: 'ShortString' and 'String'


 
J'ai essayé de mettre les 2 en Shortstring, marche pas, les deux en String[17], marche encore moins :d
 
Lé où l'erreur ? :sweat:  

n°924652
antp
Super Administrateur
Champion des excuses bidons
Posté le 16-12-2004 à 00:26:30  profilanswer
 

Tu mets bêtement string et ça doit passer.
Je vois pas l'intérêt d'utiliser des ShortString à part pour des records de taille fixe.
(ShortString = chaîne de longueur fixe comme dans les vieilles versions de Pascal)
 
Normalement on écrit "string" et non pas "String", string étant un mot-clé alors que Integer par exemple est un type (d'ailleurs string s'affiche en gras). Dans Delphi le mot-clé string désigne par défaut une AnsiString.
Même si c'est pas case-sensitive, il y a des conventions d'écriture :D
http://community.borland.com/artic [...] 80,00.html


Message édité par antp le 16-12-2004 à 00:28:12

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°924653
Inekman
Posté le 16-12-2004 à 00:28:29  profilanswer
 

oui c'est bien ça, il me faut uniquement 17 caractères :)

n°924654
antp
Super Administrateur
Champion des excuses bidons
Posté le 16-12-2004 à 00:33:00  profilanswer
 

Il te faut 17 caractères, mais tu t'en fous que ta classe prenne 17 ou 21 octets en mémoire :D
Avec les property à mon avis tu pourras pas jouer avec les ShortString à moins de définir un type pour une ShortString de longueur 17.
Ce qui est un peu tordu.
Comme je l'ai dit à moins de les utiliser dans des record qui doivent avoir une taille fixe et pas de pointeur (par ex parce qu'ils sont balancés tel quels en mémoire ou sur le disque), on n'utilise pas les ShortString.
Si jamais tu veux être sûr que ta chaîne ait moins de 17 caractères, tu mets un SetLogiciel dans le write de ta property, et dans ce SetLogiciel tu mets :
 
FLogiciel := Copy(Value, 1, 17);
(Value étant le param reçu par la fonction).


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°924655
Inekman
Posté le 16-12-2004 à 00:37:14  profilanswer
 

Oui c'est exactement ce que j'étais en train de faire en fait :d
 
je bricole, je bricole :crazy:

n°927363
Inekman
Posté le 19-12-2004 à 12:34:25  profilanswer
 

Je voudrai savoir un autre petit truc. Je voudrai savoir quelle est la taille optimale d'un buffer pour écrire un flux de données dans un fichier. Je sais pas quoi mettre comme valeur, 1 ko, 32 ko, 1 Mo ? C'est quoi la meilleure taille si on souhaite écrire des fichiers de plusieurs dizaine de Mo ?
 
Pour l'instant j'ai choisi 64 ko mais vraiment au hasard.
 
Merci :-)

n°927397
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-12-2004 à 13:09:46  profilanswer
 

Ça je ne sais pas. De toute façon le TFileStream va le découper en blocs je pense.
Vu la vitesse d'écriture de 64 Ko, tu risques de ralentir la copie parce que ça rafraichira trop souvent l'affichage. Si tu fais des blocs de 256 Ko par exemple (ou même 512 Ko, voire 1 Mo) ça ira tout aussi bien je pense.


Message édité par antp le 19-12-2004 à 13:10:02

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°927427
Inekman
Posté le 19-12-2004 à 13:55:54  profilanswer
 

je vais faire des tests avec toutes ces valeurs :)
 
Merki.

mood
Publicité
Posté le 19-12-2004 à 13:55:54  profilanswer
 

n°927674
Inekman
Posté le 19-12-2004 à 22:57:11  profilanswer
 

Yop, nouvelle question :)
 
Je bloque là pour déterminer la vitesse à laquelle sont écrites les données du flux en Mo.
 
J'ai pensé à un truc du genre :
 
vitesse = taille données écrites / temps d'exécution en seconde
 
Normalement je devrai avoir le nombre de MO écrit en 1 seconde non ? ze sais pas trop :whistle:


Message édité par Inekman le 19-12-2004 à 22:57:26
n°927703
antp
Super Administrateur
Champion des excuses bidons
Posté le 19-12-2004 à 23:37:41  profilanswer
 

oui, si tu fournis la taille en Mo


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°927707
Inekman
Posté le 19-12-2004 à 23:41:12  profilanswer
 

finalement g trouvé + simple, je sais pas si c mieux mais en tout cas ça marche :d
 
vitesse = Données écrites en Mo actuel - Données écrites en Mo il y'a 1 sec
 
et voilu :d


Message édité par Inekman le 19-12-2004 à 23:41:26

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Delphi/Pascal

  Ecrire dans un fichier avec TFileStream...

 

Sujets relatifs
Perl : est il possible de lire un fichier sans le bloquer en écriture?obtenir un fichier .c a partir d'une librairie .a
Ouverture de fichier image incorrectelien vers un fichier sur le disque-ouverture du fichier en cliquant
Gestion droits fichieridhttp + verifier le presence d'un fichier?
Automatiser la crétion d'un fichier .txt sur le netPB avec un fichier .h
structure du fichier xmEnregistrer pointeurs et leurs contenus dans un fichier
Plus de sujets relatifs à : Ecrire dans un fichier avec TFileStream...


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR