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

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

Marsh Posté le 30-04-2002 à 11:28:09    

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 !
Reply

Marsh Posté le 30-04-2002 à 11:28:09   

Reply

Marsh Posté le 30-04-2002 à 11:44:38    

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
Reply

Marsh Posté le 30-04-2002 à 11:53:14    

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
Reply

Marsh Posté le 30-04-2002 à 12:03:00    

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 !
Reply

Marsh Posté le 30-04-2002 à 12:11:54    

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 !
Reply

Marsh Posté le 30-04-2002 à 12:26:11    

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
Reply

Marsh Posté le 30-04-2002 à 12:32:35    

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 !
Reply

Marsh Posté le 30-04-2002 à 12:36:26    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed