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

  FORUM HardWare.fr
  Programmation
  Perl

  lecture fichier par bundle de lignes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lecture fichier par bundle de lignes

n°1011997
mandracke7​6
Posté le 14-03-2005 à 13:37:41  profilanswer
 

bonjour,
 
Je sais qu'il est facile de charger en memoire tout le contenue d'un fichier dans un tableau en perl:
 
#Ouverture fichier  
open(FILE_IN, "< toto.txt" ) || die "ERROR - $! : toto.txt\n";
# Chargement dans un tableau
my @FileTab =  <FILE_IN>;
# Fermeture du fichier
close FILE_IN;
 
#Lecture ligne à ligne
foreach (@FileTab){
s/[\r|\n]*//g;
...
}

 
Mais dans mon cas le fichier risque de contenir enormement de lignes, alors je voudrais avoir la possibilité de charger mon fichier par block de 'n' lignes à la fois.
 
Est ce possible, de preference sans proceder à un appel system de type split?
 
Merci d'avance.

mood
Publicité
Posté le 14-03-2005 à 13:37:41  profilanswer
 

n°1012011
couak
Posté le 14-03-2005 à 13:48:45  profilanswer
 

fonction read(HANDLE, $destination, taille)

n°1012173
mandracke7​6
Posté le 14-03-2005 à 15:55:14  profilanswer
 

Il y a un pb, la taille de mes ligne n'est pas fixe.
Alors que la taille que tu m'indique est en byte.

n°1012496
matafan
Posté le 14-03-2005 à 19:47:13  profilanswer
 

Si tu utilises <> dans un contexte scalaire, ca lit une ligne. Et si tu fais une petite boucle genre "for my $i (1..10) push(@FileTab, scalar <> );", tu lira n lignes.

n°1012617
trictrac
Posté le 14-03-2005 à 22:12:10  profilanswer
 

open(FILE_IN,"<toto.txt" )|| die "bla bla bla";
while <FILE_IN> {
 action quelquonque
 encore
}
 
Dans la boucle, $_ représente la ligne courante, et il lit toute les lignes une par une ..

n°1012894
mandracke7​6
Posté le 15-03-2005 à 08:50:37  profilanswer
 

Oui, j'avais pensé a cette solution. Mais je voulais pouvoir limitter les access disques. Et recuper un paquet de donnees suffisant sans avoir a lire le disque pour chaque ligne et plus tot travailler en memoire.

n°1013194
couak
Posté le 15-03-2005 à 12:14:31  profilanswer
 

pour travailler en mémoire c'est tout mettre dans un tableau
d'ailleurs il est recommandé de le faire, j'ai lu ca dans les bonnes pratiques perl chais plus où

n°1013202
Mr Mala
Posté le 15-03-2005 à 12:21:21  profilanswer
 

mandracke76 a écrit :

.. Mais je voulais pouvoir limitter les access disques. Et recuper un paquet de donnees suffisant sans avoir a lire le disque pour chaque ligne ...


 
Et à ton avis, ça "my @FileTab =  <FILE_IN>;" ça fait quoi ? :sweat:  
 
La solution de matafan convient ... et est même de loin la plus cohérente ! Enfin en rajoutant le contrôle de fin de fichier etc etc ... mais le principe est là ...
TU dois compter toi-même le nombre de ligne que tu lis, push dans un tableau et traite ...


Message édité par Mr Mala le 15-03-2005 à 12:24:01
n°1013205
mandracke7​6
Posté le 15-03-2005 à 12:23:04  profilanswer
 

Oui mais quand tu as un fichiers plus d'un milion de ligne, qui correspond a un extract de base. Je te raconte pas la prise de place en memoire.

n°1013211
Mr Mala
Posté le 15-03-2005 à 12:26:35  profilanswer
 

mandracke76 a écrit :

Oui mais quand tu as un fichiers plus d'un milion de ligne, qui correspond a un extract de base. Je te raconte pas la prise de place en memoire.


 
Mais non ! :heink: ..
Quand tu as traité tes N lignes lues et mises en mémoire dans un tableau ben tu vires le contenu du tableau et tu le réutilises pour les loads suivants !!! ...
Maintenant c'est clair que si le traitement de la ligne 282.456 a besoin de la ligne 6 ... c'est clair que c'est foireux ! :/
( faut dire que tu n'as pas précisé le type de traitement que tu veux faire [:spamafote] )
 

mood
Publicité
Posté le 15-03-2005 à 12:26:35  profilanswer
 

n°1013279
mandracke7​6
Posté le 15-03-2005 à 13:21:58  profilanswer
 

Non dans mon programme je n'ai pas d'interaction entre la ligne i et la ligne i+1000 ou -1000.
 
Mais ma principale preoccupation est d'eviter de creer un tableau en memoire de plus d'un milion de ligne. Et pouvoir lire le contenue du fichier sans faire un acces disque a chaque fois que je veux lire le fichier.

n°1013306
pospos
Posté le 15-03-2005 à 13:47:04  profilanswer
 

si tu fais une lecture ligne par ligne (avec un while et un <> en contexte scalair) ca ne fera pas pour autant plus d'acces disque: il n'y aura pas un acces disque par ligne lue, car Perl utilise une couche d'abstraction pour les IO avec un systeme de cache. En gros à ta premier lecture il va lire (par exemple) 8ko, et ne refera un nouvel acces disque que kand ce tampon sera epuisé (pour charger à nouveau 8ko). Donc pas de probleme d'efficacité.

n°1013310
Mr Mala
Posté le 15-03-2005 à 13:51:32  profilanswer
 

mandracke76 a écrit :


Mais ma principale preoccupation est d'eviter de creer un tableau en memoire de plus d'un milion de ligne.


 
DONC il faut lire ton fichier par bloc, mettre en mémoire, traiter, virer le tableau en mémoire et continuer la lecture jusqu'à plus de lignes ...
 

mandracke76 a écrit :


 Et pouvoir lire le contenue du fichier sans faire un acces disque a chaque fois que je veux lire le fichier.


 
DONC il faut lire tout le fichier d'un coup et le mettre dans un tableau en mémoire ..
 
 
Je n'ai même pas l'impression que tu te rends compte du caractère totalement antagoniste de ce que tu dis ...... :sweat:  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  lecture fichier par bundle de lignes

 

Sujets relatifs
spécification des droits lors de la création d'un fichierFichier pour login/pass en flash
lecture des n prochains bits du buffer...[C#] connaitre le nombre de ligne sans parcourir fichier
Attacher 1 table Access à 1 fichier Excel avec mot de passelecture d'un fichier wav en C
connaitre la taille d'un fichier[C++]XML/QT/QDom - lecture d'un DTD et d'un XML
Compter des lignes 
Plus de sujets relatifs à : lecture fichier par bundle de lignes


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