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 08/04/2013, à 18:02

BrunoL

[Resolu]Traitement paralléle et ligne de cde

Bonjour,

J'essaie de peaufiner un script qui me transforme en masse des fichiers raw (10.000) vers du jpg.

Le sésame est ufraw-batch qui s'en sort très bien mais c'est un peu long. Ce qui me gave car j'ai à disposition un proc à 8 cœurs et globalement 1 bosse et les 7 autres glandouillent.

D'où ma question, est-il possible d'affecter en ligne commande des traitements à différents proc. ? chaque traitement d'un fichier étant indépendant.

Merci.

Euh le script& , j'ai donné ... ;-)

Dernière modification par BrunoL (Le 13/04/2013, à 10:22)

Hors ligne

#2 Le 08/04/2013, à 18:36

Brunod

Re : [Resolu]Traitement paralléle et ligne de cde

A priori, rien n’empêche de lancer plusieurs fois le script.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#3 Le 08/04/2013, à 18:43

Hizoka

Re : [Resolu]Traitement paralléle et ligne de cde

mais je ne crois pas que ca fera travailler les differents coeurs...

pour la prise en charge des coeurs, il faut que le logiciel qui est executé soit programmé pour les utiliser


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 08/04/2013, à 19:12

Brunod

Re : [Resolu]Traitement paralléle et ligne de cde

Tu lances plusieurs instances en // et chacune passe sur un coeur. C'est en tout cas ainsi que ça se passe sur mon bi xeon.


Windows est un système d'exploitation de l'homme par l'ordinateur. Linux, c'est le contraire...
39 pc linux convertis

Hors ligne

#5 Le 08/04/2013, à 20:03

BrunoL

Re : [Resolu]Traitement paralléle et ligne de cde

Mon idée serait de scruter l'utilisation cpu genre top -b -n1|grep ...
et tant qu'un certain niveau n'est pas atteint de lancer des job unitaires en &

wait après que ce niveau soit atteint etc...

Mais c'est de la théorie car je n'arrive pas à comprendre comment on trouve l'activité moyenne des procs sad

Je continue à chercher car à vu de nez je compterai bien sur une division par 2 du délai de traitement cool

Hors ligne

#6 Le 09/04/2013, à 06:59

serged

Re : [Resolu]Traitement paralléle et ligne de cde

J'ai un script de "stress" de CPU (c'est une simple boucle sans fin). Je le lance dans plusieurs terminaux et le moniteur système me montre bien que les cœurs sont occupés.

Note pour BrunoL : On peut calculer plus simplement (dans un script) la charge des processeurs avec /proc/loadavg


LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)

Hors ligne

#7 Le 09/04/2013, à 12:33

BrunoL

Re : [Resolu]Traitement paralléle et ligne de cde

Merci serged pour /proc/loadavg nettement meilleur pour mon usage que top. Je vais voir le manuel.

Hors ligne

#8 Le 09/04/2013, à 15:09

obibann

Re : [Resolu]Traitement paralléle et ligne de cde

N'y a-t-il pas moyen de s'en sortir avec la commande "taskset" ?


Ubuntu 16.04
Avec Windows, on fait ce qu'on peut... Avec Linux, on fait ce qu'on veut !! :p

Hors ligne

#9 Le 13/04/2013, à 10:22

BrunoL

Re : [Resolu]Traitement paralléle et ligne de cde

Je m'en suis sorti avec

cat /proc/stat | grep '^cpu '

et un gros coup de pouce de Paul Colby
Je comprends pas vraiment cette cuisine de  moyenne proc et autre IDLE mais je lui fais confiance.

En pratique cela fonctionne et sur un échantillon (87 fichiers) le temps est divisé par environ 2,5. Je passe effectivement de 35% de cpu utilisée au compteur du moniteur système à ... 100%. Ma ram commence à charger et je pense que c'est là que je risque avoir chaud wink

La semaine prochaine je renvoi cela sur le stock réel je verrai si cela se concrétise.
Bon WE et merci pour votre aide.

Hors ligne

#10 Le 13/04/2013, à 13:24

Hizoka

Re : [Resolu]Traitement paralléle et ligne de cde

tu pourras nous detailler ce que tu auras fait si c'est ok stp ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#11 Le 15/04/2013, à 19:00

BrunoL

Re : [Resolu]Traitement paralléle et ligne de cde

C'est OK le délai de traitement a été divisé par 3 (1h au lieu de 3!).
J'ai fait exactement ce que je répondais à BrunoD.
Mieux qu'une longue explication le script qui m'a permis de tester ma solution. Il appelle le script consoCpu.sh qui consomme quelques minutes de processeur. Ce qui m'importait c'est le parcours de l’arborescence de départ sans faire des paquets à la main comme le suggérait BrunoD et surtout d'éviter que la machine s'effondre comme cela c'est produit lorsque j'ai envoyé tout en & en croyant que le scheduler allait s'en dépatouiller roll
La perle c'est consoCpuTot() trouvée ici.
Je traite le répertoire ~/Téléchargement parce que ... wink

#!/bin/bash
#
# structure d'un traitement en parallèle
#Pour bourrer les cœurs disponibles

consoCpuTot ()
	{
	PREV_TOTAL=0;PREV_IDLE=0;periode=0;CUM_DIF_USAGE=0;MOY_DIF_USAGE=0
	while [ $periode -lt 5 ]; do
		CPU=(`cat /proc/stat | grep '^cpu '`) 
		unset CPU[0]  
		IDLE=${CPU[4]} 
		TOTAL=0
		for VALUE in "${CPU[@]}"; do
			let "TOTAL=$TOTAL+$VALUE"
		done
		let "DIFF_IDLE=$IDLE-$PREV_IDLE"
		let "DIFF_TOTAL=$TOTAL-$PREV_TOTAL"
		let "DIFF_USAGE=(1000*($DIFF_TOTAL-$DIFF_IDLE)/$DIFF_TOTAL+5)/10"
		let "DISPO=100-$DIFF_USAGE"
		PREV_TOTAL="$TOTAL"
		PREV_IDLE="$IDLE"
		let "CUM_DIF_USAGE=$CUM_DIF_USAGE+$DIFF_USAGE"
		sleep 0.5
		let "periode=$periode+1"
	done

	let "MOY_DIF_USAGE=$CUM_DIF_USAGE/$periode"
	}
#
jobLancer()
	{
	JOB_ENCOURS=`ps hax|egrep -w '[c]onsoCpu.sh'|wc -l`
	consoCpuTot	
	if [ $JOB_ENCOURS = 0 ]; then JOB_ENCOURS=1; fi
	let "JOB_LANCER=$DISPO/($MOY_DIF_USAGE/$JOB_ENCOURS)"
	echo "=== DISPO="$DISPO "MOY_DIF_USAGE="$MOY_DIF_USAGE "JOB_ENCOURS="$JOB_ENCOURS "***" >> $ficLog
	}

premier=0; JOB_ENCOURS=0;JOB_LANCER=2
repScript="/home/bruneau/work/consoProcess"
ficLog="$repScript/log_"${0#*/*}		# nom script sans chemin
repSrce="/home/bruneau/Téléchargements"

echo "début du job :  `date +%Y-%m-%d_%Hh%Mmn`" > $ficLog

shopt -s globstar
for file in $repSrce/**
do
	if [ "$JOB_LANCER" -gt 0 ]; then
		echo -e "+++ Je lance traitement de" $file "\tà "`date +%Hh%Mmn%Ssec%N`"! +++" >> $ficLog
			#traitGlobal
			"$repScript/"consoCpu.sh&
		let "JOB_LANCER=$JOB_LANCER-1"
	fi
	while [ $JOB_LANCER = 0 ];
		do
			echo -e "--- je ne peux rien lancer \tà "`date +%Hh%Mmn%Ssec%N`"! ---" >> $ficLog
			jobLancer
		done
	echo "intermed :  `date +%Y-%m-%d_%Hh%Mmn%Ssec`; JOB_LANCER ="$JOB_LANCER "JOB_ENCOURS="$JOB_ENCOURS >> $ficLog
done
echo "fin du job :  `date +%Y-%m-%d_%Hh%Mmn%Ssec`" >> $ficLog

On peut faire mieux car par moment l'utilisation des proc dans le traitement réel passé à 14% et 35%. N'hésitez pas à l'améliorer.
J'espère avoir été clair. cool

Dernière modification par BrunoL (Le 15/04/2013, à 19:03)

Hors ligne