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

  FORUM HardWare.fr
  Programmation

  [ALGO] Lire les n dernières lignes d'un fichier texte

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ALGO] Lire les n dernières lignes d'un fichier texte

n°132608
kadreg
profil: Utilisateur
Posté le 30-04-2002 à 11:28:09  profilanswer
 

Bonjour,
 
Je suis en train de faire un programme qui a besoin de lire les n dernières lignes d'un fichier texte. A l'origine, j'avais une boucle qui lisait le fichier avec une file de taille n pour garder des lignes, quand j'arrivait à la fin du fichier, ma file contenait mes n lignes.
 
Mais maintenant, le fichier lu est devenu trop gros. Et il faut de longues secondes pour lire ces lignes, sachant que 99,9% du fichier ne m'interresse pas (ou plutot plus). Je cherche donc un algorithme efficace pour que cette lecture soit la plus rapide possible.
 
Contraintes :
- le fichier est un fichier texte, organisé par lignes (c'est des logs)
- l'implémentation de la lecture est en PHP
- je n'ai pas le droit de modifier le fichier source
- pas d'appels à tail en cachette ;)


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
mood
Publicité
Posté le 30-04-2002 à 11:28:09  profilanswer
 

n°132615
mareek
Et de 3 \o/
Posté le 30-04-2002 à 11:44:38  profilanswer
 

Tu fais un tableau de chaines de n éléments (où n est le nombre de ligne que tu veux lire) et tu stocke chaque nouvelle ligne que tu lis dans tab[n] en décalant tous les autres éléments d'un cran. C'est hyper pas optimisé, mais ça devrait marcher.


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
n°132624
antp
Super Administrateur
Champion des excuses bidons
Posté le 30-04-2002 à 11:53:14  profilanswer
 

kadreg a écrit a écrit :

 
- pas d'appels à tail en cachette ;)  




 
Récupère le source de tail :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°132636
kadreg
profil: Utilisateur
Posté le 30-04-2002 à 12:03:00  profilanswer
 

mareek a écrit a écrit :

 C'est hyper pas optimisé, mais ça devrait marcher.  




 
Ce que je cherche, c'est justement un truc optimisé. J'ai déjà une version qui marche utilisant ce principe, mais super lente.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°132647
kadreg
profil: Utilisateur
Posté le 30-04-2002 à 12:11:54  profilanswer
 

antp a écrit a écrit :

 
 
Récupère le source de tail :D  




 
Arf, j'avais peur de fouiller deux heures dans le truc, et j'ai trouvé tout de suite l'idée. C'est la fonction file_lines qui m'interresse, et l'idée utilisée est bien bonne. C'est exactement ce qu'il me faut.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°132654
mareek
Et de 3 \o/
Posté le 30-04-2002 à 12:26:11  profilanswer
 

toujours avec un tableau de n elements, tu peux stocker tes lignes dans le tableau n en écrasant les valeurs précédentes.
 
en algo ça donnerait un truc du genre
 

Code :
  1. while (not EOF(fichier)
  2.   tab[i modulo n]= fichier.line(i)
  3.   i=i+1
  4. end while


à la fin tu as un tableau du genre
 
tab[1]: ligne 31
tab[2]: ligne 32
tab[3]: ligne 28
tab[4]: ligne 29
tab[5]: ligne 30
 
avec i=33  
 
la première ligne qui t'intéresse est à la position i modulo n (3 dans ce cas là)


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
n°132655
kadreg
profil: Utilisateur
Posté le 30-04-2002 à 12:32:35  profilanswer
 

Mareek> le fichier lu est un log qui fait aujourd'hui 14Mo (300 000 lignes si ma mémoire est bonne), généralement, ce sont les 10/20/100 ou 1000 dernières lignes qui m'interressent, avec toutes ces méthodes je me tape la lecture de tout le fichier et cela ne me va pas (beaucoup trop long).
 
Ce que fait GNU/tail, c'est qu'il utilise un tampon de 8Ko. Après l'ouverture du fichier il fait un seek sur (taille du fichier - 8Ko) et cherche les dernières lignes ici. Si cela ne suffit pas, il rajoute les 8Ko précédent afin de rajouter des lignes, et ainsi de suite jusqu'a avoir les n lignes. Il y a une petite gymnastique à faire pour la ligne coupée en deux par la fenetre, mais cette méthode me semble etre la plus efficace pour faire ce que je fait.

 

[jfdsdjhfuetppo]--Message édité par kadreg le 30-04-2002 à 12:33:19--[/jfdsdjhfuetppo]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°132656
mareek
Et de 3 \o/
Posté le 30-04-2002 à 12:36:26  profilanswer
 

kadreg a écrit a écrit :

Mareek> le fichier lu est un log qui fait aujourd'hui 14Mo (300 000 lignes si ma mémoire est bonne), généralement, ce sont les 10/20/100 ou 1000 dernières lignes qui m'interressent, avec toutes ces méthodes je me tape la lecture de tout le fichier et cela ne me va pas (beaucoup trop long).
 
Ce que fait GNU/tail, c'est qu'il utilise un tampon de 8Ko. Après l'ouverture du fichier il fait un seek sur (taille du fichier - 8Ko) et cherche les dernières lignes ici. Si cela ne suffit pas, il rajoute les 8Ko précédent afin de rajouter des lignes, et ainsi de suite jusqu'a avoir les n lignes. Il y a une petite gymnastique à faire pour la ligne coupée en deux par la fenetre, mais cette méthode me semble etre la plus efficace pour faire ce que je fait.  
 
 




 
Pas de prob, j'a vais pas vu ta réponse précédente (et je ne connais pas tail dailleurs). Je répondais juste d'un point de vue algorithmique.
 
sur ce, je vais bouffer.
 
bonne chance pou la suite :hello:


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack

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

  [ALGO] Lire les n dernières lignes d'un fichier texte

 

Sujets relatifs
Pb de VB avec les extration de chaine sur fichier .txt[Ada]fichier texte
[VC++] problème avec projet contenant plusieurs fichier .C[Algo] - Quelques bons liens sur les algo pour écrans tactiles ! ! ! !
[java] comment obtenir le propriétaire d'un fichier sous nt4[C / C++] un client FTP activeX pour uploader un fichier en ASYNC ?
[JAVA] Affichage texte[C++] chercher un sub-chunk dans un fichier AVI ?
[javascript] Souligner une partie d'un texte mise en surbrillance 
Plus de sujets relatifs à : [ALGO] Lire les n dernières lignes d'un fichier texte


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