#1 Le 20/08/2013, à 10:44
- Compte supprimé
[Résolu] Script plus lent à cause du pipe ???
Bonjour,
Je fais appel à vos connaissances...
Voici un bout de script qui extrait les sous-titre via Mencoder et affiche le pourcent à l'écran...
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null |
awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}'
Mais avec Zenity c'est plus joli...
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null |
awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}' |
zenity --progress --auto-close
Cela fonctionne bien... Mais avec Zenity c'est plus lent ???
Voilà ce que je soupçonne comme problème. Mencoder envoie beaucoups d'information à la seconde et j'imagine que le pipe avant Zenity me ralanti le proccessus...
Selon ce que j'ai pu lire sur une page internet...
Le système contrôle l'exécution des processus qui se trouvent aux deux bouts d'un tube, de telle sorte que le transfert de données puisse toujours se faire. Si le processus source a trop de données, il est figé par le système d'exploitation en attendant que le processus consommateur ait fini de traiter les données déjà présentes. Inversement, si le processus source est trop lent, c'est le processus consommateur qui attendra patiemment que les données soient disponibles.
Quelle serai la solution pour avoir quasiment la même vitesse avec Zenity ???
Dernière modification par Compte supprimé (Le 28/03/2015, à 01:14)
#2 Le 20/08/2013, à 18:39
- NicoZic56
Re : [Résolu] Script plus lent à cause du pipe ???
Hello.
Je pense qu'il faut consommer rapidement les lignes de sorties de la première commandes.
Avant zenity, je pense que l'output est
0%
0%
...
répété plein de fois
puis
1%
répété plein de fois
Chaque ligne provoque un rafraîchissement de la boîte de dialogue, ce qui fait ramer.
Je pense qu'il faudrait insérer un processus intermédiaire dans ta ligne qui filtre les lignes identiques (awk '!x[$0]++'). Il va consommer rapidement les lignes sans prendre trop de temps.
Ce qui donnerait :
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null |
awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}' | awk '!x[$0]++' |
zenity --progress --auto-close
Il faudrait encore optimiser en donnant à awk les 2 instructions en même temps, mais là j'avoue que je ne sais pas faire.
============
"Il n'y a que deux sortes de langages de programmation: ceux dont les gens disent toujours du mal et ceux que personne n'utilise."
Bjarne Stroustrup
Hors ligne
#3 Le 21/08/2013, à 08:24
- Compte supprimé
Re : [Résolu] Script plus lent à cause du pipe ???
Salut NicoZic56
Ton code
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null |
awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}' | awk '!x[$0]++'
fonctionne à merveille, merci pour l'astuce.
Mais effectiffement il faut maintenant trouvé le moyen d'envoyer tout ça vers Zenity...
Dernière modification par Compte supprimé (Le 28/03/2015, à 01:13)
#4 Le 21/08/2013, à 09:14
- NicoZic56
Re : [Résolu] Script plus lent à cause du pipe ???
Heu.. il faut juste que tu rajoutes l'appel vers zeity dans la ligne. L'aurais-tu oublié dans le copier-coller ?
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null | awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}' | awk '!x[$0]++' | zenity --progress --auto-close
============
"Il n'y a que deux sortes de langages de programmation: ceux dont les gens disent toujours du mal et ceux que personne n'utilise."
Bjarne Stroustrup
Hors ligne
#5 Le 21/08/2013, à 09:16
- Compte supprimé
Re : [Résolu] Script plus lent à cause du pipe ???
Non... cela fonctionne pas chez moi avec ...
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null | awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}' | awk '!x[$0]++' | zenity --progress --auto-close
et je ne pige pas pourquoi ???
Dernière modification par Compte supprimé (Le 21/08/2013, à 09:17)
#6 Le 21/08/2013, à 09:40
- NicoZic56
Re : [Résolu] Script plus lent à cause du pipe ???
Qu'est-ce qui ne marche pas ?
J'ai fait un test chez moi, e le problème que j'ai c'est que zenity s'affiche un peu tardivement, sinon c'est OK.
============
"Il n'y a que deux sortes de langages de programmation: ceux dont les gens disent toujours du mal et ceux que personne n'utilise."
Bjarne Stroustrup
Hors ligne
#7 Le 21/08/2013, à 10:14
- Compte supprimé
Re : [Résolu] Script plus lent à cause du pipe ???
Le problème c'est que j'ai bien Zenity qui s'affiche... mais la barre de progression ne s'affiche pas (elle reste à 0%).
Chez toi tu as une progression ???
Dernière modification par Compte supprimé (Le 28/03/2015, à 01:13)
#8 Le 21/08/2013, à 10:26
- NicoZic56
Re : [Résolu] Script plus lent à cause du pipe ???
J'ai refait des tests, et c'est un problème avec la commande awk qui supprime les lignes en doublons.
Il ne flush pas sa sortie à chaque nouvelle ligne.
Il faudrait configurer la commande de suppression des lignes pour qu'elle flush. Je ne sais pas comment faire ça. (La commande awk précédente le fait, grâce au flush dans le code passé en paramètre).
Je sais m'en sortir avec python
Tu crées un fichier "remove_dup.py" dans un répertoire contenu dans ton PATH, contenant :
#!/usr/bin/python
import sys
l1=""
while 1:
l2 = sys.stdin.readline()
if not l2: break
if l2 != l1:
sys.stdout.write(l2)
sys.stdout.flush()
l1=l2
Et tu remplaces awk '!x[$0]++' par remove_dup.py dans la ligne de commande.
============
"Il n'y a que deux sortes de langages de programmation: ceux dont les gens disent toujours du mal et ceux que personne n'utilise."
Bjarne Stroustrup
Hors ligne
#9 Le 21/08/2013, à 10:39
- credenhill
Re : [Résolu] Script plus lent à cause du pipe ???
hello
et avec le code awk de NicoZic56 modifié
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null | awk -vRS='\r' -F [%\(] '/%)/ && !x[$0]++ {printf "\n%d\n\n#%d %\n",$2, $2 ;fflush()}' | zenity --progress --auto-close
Dernière modification par credenhill (Le 21/08/2013, à 10:40)
Hors ligne
#10 Le 21/08/2013, à 10:41
- Compte supprimé
Re : [Résolu] Script plus lent à cause du pipe ???
Il ne flush pas sa sortie à chaque nouvelle ligne.
Tu m'as mis sur la piste... (petit génie )
voilà le code :
mencoder "/home/$USER/video.vob" -nosound -ovc frameno -sid 9 -vobsubout "/home/$USER/soustitrage" -vobsuboutindex 0 -o /dev/null |
awk -vRS='\r' -F [%\(] '/%)/ {printf "\n%d\n",$2 ; printf "\n#%d %\n",$2 ;fflush();}' | awk '!x[$0]++;fflush();' | zenity --progress --auto-close
effectivement il manquait le "fflush" !!!!
Donc le problème est résolu !!!
Merci vraiment pour ton aide !!!!!!!
Dernière modification par Compte supprimé (Le 28/03/2015, à 01:13)