Important Un peu de mal à comprendre le multithread...

Plus d'informations
il y a 7 mois 4 jours #33376 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 :
  • 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"
Rien que le fait de créer un namespace semble me faire perdre 6 minutes ! Cela me déroute un peu. ^^'

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 19 heures #33377 par Laurent Dardenne
Salut,
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.

Plus d'informations
il y a 7 mois 16 heures - il y a 7 mois 16 heures #33378 par FLAHAUT Samuel
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.

$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 7 mois 16 heures par FLAHAUT Samuel.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 14 heures - il y a 7 mois 14 heures #33379 par Laurent Dardenne
>>ce n'est pas évident de gagner du temps
Cela dépend de la structure de donnée manipulée.

Essaie avec Group-Object :
$References | 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]

Tutoriels PowerShell
Dernière édition: il y a 7 mois 14 heures par Laurent Dardenne.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 7 mois 13 heures #33380 par Arnaud Petitjean
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.
 

MVP PowerShell 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.

Plus d'informations
il y a 7 mois 11 heures #33383 par FLAHAUT Samuel
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.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.081 secondes
Propulsé par Kunena