Important
Un peu de mal à comprendre le multithread...
- FLAHAUT Samuel
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 6
- Remerciements reçus 0
il y a 2 mois 2 semaines #33376
par FLAHAUT Samuel
Un peu de mal à comprendre le multithread... a été créé par FLAHAUT Samuel
Bonjour,
Quelque chose m'échappe pour le multithread... j'ai 56'000 objets et je dois vérifier si j'ai des doublons ; voici les chronos :
Quelque chose m'échappe pour le multithread... j'ai 56'000 objets et je dois vérifier si j'ai des doublons ; voici les chronos :
- mode !// 1 thread : 0'12"
- mode // 1 thread : 6'55"
- mode // 2 thread : 6'13"
- mode // 3 thread : 6'37"
- mode // 4 thread : 8'06"
- mode // 5 thread : 9'43"
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6298
- Remerciements reçus 68
il y a 2 mois 2 semaines #33377
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Un peu de mal à comprendre le multithread...
Salut,
un exemple de code peut être?
Et si tu as une seule collection d'objet pourquoi utiliser le 'multithread' ?
un exemple de code peut être?
Et si tu as une seule collection d'objet pourquoi utiliser le 'multithread' ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- FLAHAUT Samuel
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 6
- Remerciements reçus 0
il y a 2 mois 2 semaines - il y a 2 mois 2 semaines #33378
par FLAHAUT Samuel
Réponse de FLAHAUT Samuel sur le sujet Un peu de mal à comprendre le multithread...
Bonjour,
La réponse est dans la question : "Une collection de 56000 objets" , du coup je pensais que l'utilisation de l'option -parallel (Foreach-Objet) allait me faire gagner du temps ; j'ai aussi essayé de diviser le travail en 4 collections pour 4 jobs mais le résultat est le même qu'avec l'option -parallel.
Du coup, je trouve que ce n'est pas évident de gagner du temps même avec une tache répétitive non séquentielle.
Je me suis même posé la question s'il pouvait exister un paramètre pouvant empêcher PowerShell d'utiliser plusieurs CPU.
La réponse est dans la question : "Une collection de 56000 objets" , du coup je pensais que l'utilisation de l'option -parallel (Foreach-Objet) allait me faire gagner du temps ; j'ai aussi essayé de diviser le travail en 4 collections pour 4 jobs mais le résultat est le même qu'avec l'option -parallel.
Du coup, je trouve que ce n'est pas évident de gagner du temps même avec une tache répétitive non séquentielle.
Je me suis même posé la question s'il pouvait exister un paramètre pouvant empêcher PowerShell d'utiliser plusieurs CPU.
$Duplicate=@{
"value" = $false
"content" = @()
"i" = 0
}
$References = ($Collection | Select-Object -Property Reference)
$Count = $Collection.Count
$Collection | ForEach-Object {
Write-Progress -Activity "ANALYSE... : " -Status "Recherche des doublons..." -PercentComplete (($Duplicate).i * 100 / $Count)
$Reference = $_.Reference
$CountR = 0
$References | ForEach-Object {if ($_ -eq $Reference) {$CountR++}}
if ($CountR -gt 1) {
($Duplicate).Value = $true
($Duplicate).content += ("L'object {0} est en {1} exemplaires." -f $Reference, $CountR) }
($Duplicate).i++
}
Write-Progress -Activity "ANALYSE... : " -Completed
if ($Duplicate.value) {Write-Host -ForegroundColor Red ("Des objets en double ont été trouvés :") ; $Duplicate.content}
else {Write-Host -ForegroundColor Green ("Aucun doublon dans les objets.")
}
Dernière édition: il y a 2 mois 2 semaines par FLAHAUT Samuel.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6298
- Remerciements reçus 68
il y a 2 mois 2 semaines - il y a 2 mois 2 semaines #33379
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Un peu de mal à comprendre le multithread...
>>ce n'est pas évident de gagner du temps
Cela dépend de la structure de donnée manipulée.
Essaie avec Group-Object :
cela permet de trouver les objets dupliqués ( cf.propriété 'Count')
voir aussi :
flexiple.com/algorithms/big-o-notation-cheat-sheet
Le parallèle sous Powershell, permet d'exécuter un traitement sur + serveurs en même temps. Pour une opération de tri je ne pense pas que cela soit utile, de plus les données seraient 'isolées'.[/code][/code]
Cela dépend de la structure de donnée manipulée.
Essaie avec Group-Object :
$References | Group-Object
voir aussi :
flexiple.com/algorithms/big-o-notation-cheat-sheet
Le parallèle sous Powershell, permet d'exécuter un traitement sur + serveurs en même temps. Pour une opération de tri je ne pense pas que cela soit utile, de plus les données seraient 'isolées'.[/code][/code]
Tutoriels PowerShell
Dernière édition: il y a 2 mois 2 semaines par Laurent Dardenne.
Connexion ou Créer un compte pour participer à la conversation.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 2 mois 2 semaines #33380
par Arnaud Petitjean
MVP (Reconnect) et créateur de ce magnifique forum
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Réponse de Arnaud Petitjean sur le sujet Un peu de mal à comprendre le multithread...
Bonjour Samuel,
En effet comme le souligne Laurent, pour dédoublonner une collection, ce n'est pas l'exécution parallèle qui va te faire gagner du temps. En effet, en exécution parallèle, l'objet en cours de traitement n'a pas connaissance des autres (isolation mémoire oblige !). Donc pour pouvoir dédoublonner une collection, on voit que ça ne peut pas fonctionner.
D'autant plus que dans ton exemple, tu indiques une hashtable et qu'il est impossible d'avoir des doublons sur les noms des clés dans une hashtable...
PowerShell n'utilise effectivement qu'un seul coeur de processeur par défaut. Si tu veux utiliser toute la puissance disponible de ta machine, tu vas devoir créer des jobs ou des threads.
Regardes les commandes Start-Job ou ainsi que toutes les commandes qui ont le paramètres -AsJob via Get-Command -Parameter -AsJob.
Par ailleurs, PowerShell 7 apporte des facilités pour créer des threads. Je t'invite à lire cette rubrique d'aide : about_Thread_Jobs
Enfin, pour mesurer le temps d'exécution d'un script, tu as la commande Measure-Command qui est super pratique.
Et pour être tout à fait exhaustif sur le sujet, il existe le module Profiler qui est génial pour découvrir quelles sont les parties de ton code les plus lentes.
En effet comme le souligne Laurent, pour dédoublonner une collection, ce n'est pas l'exécution parallèle qui va te faire gagner du temps. En effet, en exécution parallèle, l'objet en cours de traitement n'a pas connaissance des autres (isolation mémoire oblige !). Donc pour pouvoir dédoublonner une collection, on voit que ça ne peut pas fonctionner.
D'autant plus que dans ton exemple, tu indiques une hashtable et qu'il est impossible d'avoir des doublons sur les noms des clés dans une hashtable...
PowerShell n'utilise effectivement qu'un seul coeur de processeur par défaut. Si tu veux utiliser toute la puissance disponible de ta machine, tu vas devoir créer des jobs ou des threads.
Regardes les commandes Start-Job ou ainsi que toutes les commandes qui ont le paramètres -AsJob via Get-Command -Parameter -AsJob.
Par ailleurs, PowerShell 7 apporte des facilités pour créer des threads. Je t'invite à lire cette rubrique d'aide : about_Thread_Jobs
Enfin, pour mesurer le temps d'exécution d'un script, tu as la commande Measure-Command qui est super pratique.
Et pour être tout à fait exhaustif sur le sujet, il existe le module Profiler qui est génial pour découvrir quelles sont les parties de ton code les plus lentes.
MVP (Reconnect) et créateur de ce magnifique forum

Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?
Connexion ou Créer un compte pour participer à la conversation.
- FLAHAUT Samuel
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 6
- Remerciements reçus 0
il y a 2 mois 2 semaines #33383
par FLAHAUT Samuel
Réponse de FLAHAUT Samuel sur le sujet Un peu de mal à comprendre le multithread...
Bon... je pense qu'il faut refaire un point :
La commande Group-Object est excessivement longue (et sans indication d'avancement) quand il s'agit de 56'000 objects distincts... c'est la raison qui fait que je ne l'utilise pas ici.
Comme indiqué dans mon premier message le recours au Jobs n'a pas montré de gain.
Si on regarde le script, un tableau est créé avec uniquement les références ; donc je compte une à une le nombre d'apparition dans ce tableau... je peux très bien diviser le travail sans problème. J'avoue que cela nécessite un petit effort de repenser les scripts en mode parallel.
Measure-Command : oui, les temps donnés dans mon premier message sont récupérés grâce à cette commande...
Si je comprends bien le message : pas d'utilisation des différents cœurs sans l'utilisation du paramètre -asjob ; cela expliquerait le temps supplémentaire excessif.
La commande Group-Object est excessivement longue (et sans indication d'avancement) quand il s'agit de 56'000 objects distincts... c'est la raison qui fait que je ne l'utilise pas ici.
Comme indiqué dans mon premier message le recours au Jobs n'a pas montré de gain.
Si on regarde le script, un tableau est créé avec uniquement les références ; donc je compte une à une le nombre d'apparition dans ce tableau... je peux très bien diviser le travail sans problème. J'avoue que cela nécessite un petit effort de repenser les scripts en mode parallel.
Measure-Command : oui, les temps donnés dans mon premier message sont récupérés grâce à cette commande...
Si je comprends bien le message : pas d'utilisation des différents cœurs sans l'utilisation du paramètre -asjob ; cela expliquerait le temps supplémentaire excessif.
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.075 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Discussions générales
- Un peu de mal à comprendre le multithread...