Parcours d'arborescence : Perl ou Shell

Parcours d'arborescence : Perl ou Shell - Perl - Programmation

Marsh Posté le 06-05-2006 à 13:45:29    

Bonjour,
 
J'ai une arborescence à parcourir et je dois en extraire un certain nombre de stats sur les fichiers qu'elle contient.
Cette arbo n'est pas spécialement "light" (en gros, plus de 200 000 fichiers et plus de 200Go avec certains répertoires de plusieurs Go et plusieurs milliers de fichiers).
 
Pour chaque répertoire, les stats à extraire des fichiers ne sont pas les mêmes (taille du fichier, nombre de lignes ou nombre d'occurences d'un mot donné dans le fichier par exemple). Je compte stocker les tests à effectuer dans une base de données. Les stats extraites seront stockées par la suite dans la base également.
 
L'arbo est sur un partage NFS et mes scripts tourneront sur un serveur UNIX.
Ces scripts tournant quotidiennement, je n'ai besoin de récupérer que les fichiers du jour (sur certains répertoires, seuls une vingtaine de fichiers peuvent être concernés alors que le répertoire en contient plus de 4000).
 
Je me demandais donc si le parcours serait plus rapide avec :
- un script Perl avec fonctions Perl
- un script Perl avec appels systèmes (ex: system("find . -mtime -1 -ls" ))
- un script Shell qui écrit la liste des fichiers du jour dans un fichier texte (je parcours ensuite ce fichier, pour chaque répertoire je fais une requête en base qui me donne les tests à effectuer sur les fichiers de ce répertoire).
 
J'espère que mes explications ne sont pas trop confuses.
 
D'avance merci.

Reply

Marsh Posté le 06-05-2006 à 13:45:29   

Reply

Marsh Posté le 06-05-2006 à 14:02:34    

a mon avis dans ton cas c'est plutot NFS et le systeme de fichier natif des serveurs qui va limiter la vitesse de ton script (ton usage CPU n'ira surement pas bien haut)
Par exemple un systeme de fichier ext2 ou ext3 (sans opitimisation en hash) devient deja tres lent lorsque l'on depasse les 10 000 fichiers dans un meme repertoire (le scan du repertoire est toujours lineaire).
Meme reiserFS, pourtant reputé pour ce genre d'utilisation, devient lent vers les 30 000 fichiers (si on ne les acceded pas dans l'ordre alphabetique! c'est à dire si l'on ne fait pas un benchmarck mais qu'on l'utilise normalement!)
 
Du coup, je pense que tu devrait utiliser le langage que tu connais le mieux et t'attendre à ce que ce soit lent dans tous les cas...
 
Perl propose certians modules qui pourront t'aider, comme File::Find

Reply

Marsh Posté le 06-05-2006 à 14:09:26    

Merci pour la rapidité de la réponse :)
 
Pour l'efficacité de mes scripts, en effet je ne m'attends pas à obtenir des perfs extraordinaires :-/
J'ai même tenté l'accès à cette arbo via Samba sur un serveur Windows, et là, ce fut le drame  :sleep: :lol:
 
Je pense que je fais faire des tests rapides sur une partie de l'arbo avec les 3 solutions que j'ai évoquées plus haut, mais je crois aussi que je vais privilégier le Perl quitte à y intégrer des appels systèmes, parce que je ne connais pas vraiment le shell (même si ça doit pas être bien compliqué) et j'ai déjà un peu de retard sur mon projet.


Message édité par gen2 le 06-05-2006 à 14:10:03
Reply

Marsh Posté le 06-05-2006 à 15:41:26    

evite les appels system (les appels shell en fait) : ca rendra ton code moins portable et moins efficace que d'utiliser les fonction natives de perl et/ou les modules qui vont bien (File::Copy, File::PAth, File::Find, etc...)
 
plutot que de passer par NFS, si tous tes fichiers sont sur le meme serveur le mieux est peut etre de tout faire en ssh pour que tes scripts tournenet directement sur la machine si c'est possible

Reply

Marsh Posté le 06-05-2006 à 17:01:54    

C'est vrai que le Perl est prévu pour être portable, mais pour ce projet, c'est pas trop un problème.
Enfin c'est vrai que ça fait quand même plus propre.
 
Par contre si les appels sont moins efficaces, en effet, je vais voir du côté des modules File::xxx
 
Pour l'accès via SSH, ça m'étonnerait beaucoup que je puisse mais je vais me renseigner.

Reply

Sujets relatifs:

Leave a Replay

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