Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 20/08/2013, à 10:44

Compte supprimé

[Résolu] Script plus lent à cause du pipe ???

Bonjour, smile

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 smile

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 ???

NicoZic56 a écrit :

Il ne flush pas sa sortie à chaque nouvelle ligne.

Tu m'as mis sur la piste... (petit génie cool)

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

Dernière modification par Compte supprimé (Le 28/03/2015, à 01:13)