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

 


Dernière réponse
Sujet : [ALGO] Lire les n dernières lignes d'un fichier texte
mareek

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:


Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
mareek

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:

kadreg 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]

mareek 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à)

kadreg

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.

kadreg

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.

antp

kadreg a écrit a écrit :

 
- pas d'appels à tail en cachette ;)  




 
Récupère le source de tail :D

mareek 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.
kadreg 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 ;)

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)