Bonjour à tous,
J'ai une question concernant la rapidité (temps d'accès) en lecture sur les fichiers.
J'ai des fichiers binaires (écrits ligne par ligne par la même machine, quelques milliers de lignes) que j'arrive très bien à relire de la même manière, ligne par ligne avec un READ :
(En vrai j'ai 25 et non pas 3 "colonnes", mais pour l'exemple c'est suffisant )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 OPEN(KF,FILE='fichier',FORM='UNFORMATTED') i=1 12 READ(KF,END=11) V1(i),V2(i),V3(i) i=i+1 goto 12 11 CLOSE(KF)
(pour référence : il y a 4 octets de header et 4 octets de trailer pour chaque ligne, donc en fait 26*8 octets par ligne)
Est-ce qu'en lisant les fichiers ainsi, je ne me paie bien le temps d'accès au fichier (temps d'accès hdd, PLUS éventuellement temps d'accès réseau si fichier sur ressource externe) qu'une seule fois (lors de l'open), ou à chaque ligne (à chaque read) ?
En fait je constate un gros écart entre un fichier en local et un fichier sur ressource réseau, mais l'écart me semble trop fort pour être dû à un unique temps d'accès réseau : grosso modo <0.1s de lecture en local => 0.3s de lecture en réseau, pour un fichier de 1 Mo. (en valeur absolue cela semble peu mais je vais ensuite aller lire de nombreux fichiers, donc au bout du compte c'est pas du tout négligeable)
Pour tester, j'ai aussi lancé le bout de code suivant (pour un fichier de 4927 lignes, 25 colonnes de 8 octets chacune, + 4 octets de header et de trailer à chaque ligne, soit 26*8 octets par ligne, donc 4927*26*8 octets en tout) :
Cette implémentation ne coûte quant à elle que 0.13s, soit à peu près moitié moins que la première. Sauf erreur (j'ai bien lu et récupéré l'intégralité du fichier ?), j'en déduis donc que la boucle sur READ n'est pas terrible, mais je ne sais pas comment la remplacer efficacement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 integer*8 ibin(4927*26) ... OPEN(KF,FILE='fichier',FORM='UNFORMATTED',RECL=4927*26*8) READ(KF,REC=1) ibin
Là j'ai réussi à produire un exemple, mais je ne sais pas comment retrouver mes valeurs d'origine à partir de mon ibin (plus généralement je me dis qu'il y a sûrement mieux et/ou beaucoup plus simple).
Merci pour votre aide
Partager