|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : février 2007 Messages : 4 ![]() |
Bonjour,
Je fais appel à vos lumières pour une optimisation de script shell. Je vais essayer d'expliquer simplement mon besoin. D'où je pars: 1. J'ai un fichier plat que je recois tous les jours 2. Dedans il se présente de la manière suivante: a. Entete 'abcbdef000016345000028346'Ce que je dois faire: 1. Prendre ce fichier 2. Lire l'entete 3. En fonction de la taille des images extraire chaque image et l'enregistrer. Jusqu'ici tout va bien. J'ai donc fais un script shell en utilisant la commande DD Code :
dd bs=1 skip=$skip count=$tailledelimage if=$fichiersource of=$fichiersorti Par contre dans le cadre de fichiers avec 10 000 enregistrements ca met énormément de temps, des heures en faite (4-5h)! Je cherche donc un moyen d'optimiser cela ou alors de trouver une alternative à la commande DD. J'ai essayer de jouer avec le paramètre bs mais ca ne fonctionne pas car il faut trouver le bon bs et adapter le skip et le count du coup! Je ne sais pas si c'est assez clair mais j'espère que des experts en shell pourront m'aider! Merci d'avance pour votre aide |
|
|
10
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 538 ![]() |
concrètement j'aurais fait comme toi, parce que malgré le temps que ça prend, je ne vois pas comment faire autrement mais si une astuce fiable est proposée je suis preneur
|
|
|
00
|
|
|
#3 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 378 ![]() |
Ca met du temps parce que tu donnes une taille de bloc de 1 octer. dd fait un read() et un write() par bloc, donc si tu as 1GB de données ça te fais 1 milliard d'appels à read() et un milliard d'appels à write().
Tu as compris que dans ton cas ça allait d'être difficile ou impossible à optimiser avec dd, à cause de l'entête qu'il faut skipper et qui est toute petite. Le plus simple à mon avis serait de coder un truc en C pour extraire les images. Ca ne devrait pas être trop compliqué. Ou alors en Perl avec un unpack(). |
|
|
10
|
|
|
#4 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Citation:
Code :
dd bs=$tailledelimage skip=$skip count=1 if=$fichiersource of=$fichiersorti
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
10
|
|
|
#5 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 378 ![]() |
Dans ce cas on n'a effectivement une seule lecture et une seule écriture, mais le problème, comme l'a remarqué brucelili, c'est que le "skip" est aussi exprimé en nombre de blocs. Comme la taille à skipper est très faible (la taille du header), on a forcément une taille de bloc très faible.
Et même si on enlevait le header avant de lire le fichier, on a encore un problème du même type pour accéder à la deuxième image et aux suivantes, puisques les deux types d'image n'ont pas la même taille. Il faut prendre comme taille de bloc le pgcd des deux tailles. Si on n'a pas de bol ça peut être 1... Au mieux on peut différencier ibs et obs, de façon à ne faire qu'une grosse écriture (skip est exprimé en ibs). Mais on devra toujours faire plein de petites lectures. Mais vraiment, en C, c'est trivial à faire et ça sera beaucoup plus rapide. |
|
|
10
|
|
|
#6 |
|
Invité de passage
![]() Inscription : février 2007 Messages : 4 ![]() |
J'ai essayé...
Ca marche pas car le skip aprés n'est plus bon. Mon skip s'incremente a achaque fois avec de la manière suivante: skip= $skip + $tailleEntete + $tailleImage1 skip= $skip + $tailleEntete + $tailleImage2 ... ..... si je change le BS par la taille de l'image le skip n'est plus en phase avec la taille des blocks ! Je vais peut etre me retrouner vers un bout de code en perl. Mais si quelqu'un à d'autres idées |
|
|
10
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Citation:
Merci pour les explications
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|
|
|
10
|
|
|
#8 |
|
Invité de passage
![]() Inscription : février 2007 Messages : 4 ![]() |
Merci pour vos réactions sur mon problème.
Comme je m'en doutais il n'y a pas vraiment de solution en script shell. Etant donné que mon script est une petite application avec pas mal de fonctionnalité avec entre autre la fonctionnalité d'extraction de mon fameux fichier contenant des image, je pense étudier la proposition de matafan. Je pense faire un petit programme en C que j'appellerai dans mon script en passant en paramètre ce fichier. Cependant, je n'ai jamais trop pratiquer le C, Matafan pourrais-tu me donner quelques pistes pour démarrer le traitement de mon fichier. Merci d'avance pour ton aide. |
|
|
01
|
Copyright © 2000-2012 - www.developpez.com