Question Performance de gci ?

Plus d'informations
il y a 15 ans 4 mois #3193 par greg_
Performance de gci ? a été créé par greg_
Bonjour a tous !

je souhaites récupérer la liste des fichier d'un certain type dans un répertoire distant.
Le hic, c'est que le dossier en question est volumineux (environs 28000 fichiers)

avec le bon vieux cmd:
[code:1]dir \\machine\dossier\*.typ > fichierListe.txt [/code:1]me prend un peu moins de 2 secondes.

alors qu'en powershell,
[code:1]get-childItem -path \\machine\dossier -filter *.typ[/code:1]prend 22 secondes

et encore plus étrange, si je redirige la sortie,
[code:1]get-childItem -path \\machine\dossier -filter *.typ |out-file fichierListe.txt[/code:1]mouline pendant presque 3 minutes.

ai-je raté quelque choses?

PS: je ne sais pas si ca as une incidence, mais powershell n'est pas installer sur le server distant, uniquement sur ma machine.

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

Plus d'informations
il y a 15 ans 4 mois #3199 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
Salut,
j'ai trouvé cela sur le sujet :
www.servernewsgroups.net/group/microsoft...ting/topic13395.aspx
Il conseille de préciser le paramètre -Name.

Sinon essaie sans le filtre pour constater l'incidence sur les performances.

Et dans ton cas, PS n'est pas obligatoire sur le distant puisque dans tous les cas on s'appuit sur des API win32.

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 4 mois #3201 par greg_
Réponse de greg_ sur le sujet Re:Performance de gci ?
Merci pour ta réponse :)
Le parametre -name semble ne rien changer pour moi...

gci -path <chemin> 79 secondes
gci -name -path <chemin> 73 secondes

Le paramètre -filter quant a lui, est efficace :)
il filtre environs 60% des fichiers, donc des infos que powershell va devoir récupérer pour créer ses objets.

gci -path <chemin> -filter <filtre> 28 secondes
gci -name -path <chemin> -filter <filtre> 24 secondes

on est donc 3 fois plus rapide.
c'est d'ailleurs pareil avec le dir :
measure-command {cmd /c \"dir \\<path>\\" } 7.8 s
measure-command {cmd /c \"dir \\<path>\*.<filtre>\" } 2.56 s

et la redirection reste championne :
measure-command {cmd /c \"dir \\<path>\*.<filtre> > sortie.txt\"} 1.43s

a suivre ...

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

Plus d'informations
il y a 15 ans 2 mois #3806 par clem
Réponse de clem sur le sujet Re:Performance de gci ?
Bonjour à tous,

Je rencontre un souci similaire, j'ai crée un script, pour le boulot, qui recherche des fichiers audio , vidéos et photos dans des répertoires utilisateurs.

Le volume de données est de 750 Go et la requête à duré un peu plus de 3h !

J'ai fait un test rapide chez moi en utilisant le paramètre \"filter\" et sur un petit volume de données ça m'a paru déjà plus rapide...mais ce paramètre ne prend en compte qu'une extension apparemment or je fais un scan sur de multiples extensions de fichiers.

Que me conseillez vous comme approche pour réduire le temps d'exécution de ce script ?

[code:1]#recuperer la liste des repertoires utilsateurs
$usersfolders= Get-ChildItem -Path \"\\serveur\RepertoiresUtilsateurs\\" |where {$_.attributes -eq \"Directory\"}
#$usersfolders= Get-ChildItem -Path \"c:\\" |where {$_.attributes -eq \"Directory\"}

#variables contenant les types de fichiers à rechercher
$ext_pattern_audio=\"*.mp3\",\"*.wma\",\"*.wav\",\"*.aac\",\"*.ogg\"
$ext_pattern_video=\"*.avi\",\"*.mpg\",\"*.mpeg\",\"*.wmv\",\"*.mov\",\"*.divx\",\"*.mp4\",\"*.rm\",\"*.mkv\"
$ext_pattern_photo=\"*.jpg\",\"*.jpeg\",\"*.bmp\"

foreach ($folder in $usersfolders)
{
#afficher le nom du dossiers en cours de traitement
Write-Host $folder.fullname

#rechercher les fichiers audios
$sizeofaudiofile=0
[System.Array]$filelistaudio= Get-ChildItem $folder.fullname -Recurse -Include $ext_pattern_audio | select fullname,length,extension
$filelistaudio | foreach { $sizeofaudiofile+=$_.length }
$sizeofaudiofile=($sizeofaudiofile /1MB )
$sizeofaudiofile = [math]::round($sizeofaudiofile, 2) # Arrondi la taille à 2 décimale
Write-Host \"audio: $($filelistaudio.length) fichiers $sizeofaudiofile Mo\"

#si la taille depasse 500, ecrire l'info dans c:\audio.txt
if ($sizeofaudiofile -gt 500)
{
$folder.fullname | Out-File -FilePath c:\audio.txt -Append
\"$sizeofaudiofile Mo\" | Out-File -FilePath c:\audio.txt -Append
\"\" | Out-File -FilePath c:\audio.txt -Append
}

#rechercher les fichiers video
$sizeofvideofile=0
[System.Array]$filelistvideo= Get-ChildItem $folder.fullname -Recurse -Include $ext_pattern_video | select fullname,length,extension
$filelistvideo | foreach { $sizeofvideofile+=$_.length }
$sizeofvideofile=($sizeofvideofile /1MB )
$sizeofvideofile = [math]::round($sizeofvideofile, 2) # Arrondi la taille à 2 décimale
Write-Host \"video: $($filelistvideo.length) fichiers $sizeofvideofile Mo\"

if ($sizeofvideofile -gt 500)
{
$folder.fullname | Out-File -FilePath c:\video.txt -Append
\"$sizeofvideofile Mo\" | Out-File -FilePath c:\video.txt -Append
\"\" | Out-File -FilePath c:\video.txt -Append
}

#rechercher les fichiers photos
$sizeofphotofile=0
[System.Array]$filelistphoto= Get-ChildItem $folder.fullname -Recurse -Include $ext_pattern_photo | select fullname,length,extension
$filelistphoto | foreach { $sizeofphotofile+=$_.length }
$sizeofphotofile=($sizeofphotofile /1MB )
$sizeofphotofile = [math]::round($sizeofphotofile, 2) # Arrondi la taille à 2 décimale
Write-Host \"photo: $($filelistphoto.length) fichiers $sizeofphotofile Mo\"
Write-Host

if ($sizeofphotofile -gt 500)
{
$folder.fullname | Out-File -FilePath c:\photo.txt -Append
\"$sizeofphotofile Mo\" | Out-File -FilePath c:\photo.txt -Append
\"\" | Out-File -FilePath c:\photo.txt -Append
}



}[/code:1]

Message édité par: clem, à: 24/01/09 18:26<br><br>Message édité par: clem, à: 24/01/09 19:22

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

Plus d'informations
il y a 15 ans 2 mois #3807 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:Performance de gci ?
Salut,
essaie de réécrire ton code en un segment de pipeline.

Utilise la propriété PSIsContainer :
[code:1]
$usersfolders= Get-ChildItem -Path \&quot;\\serveur\RepertoiresUtilsateurs\\&quot; |where {$_.PSIsContainer}
[/code:1]
Ecrit plusieurs chaînes en une passe :
[code:1]
if ($sizeofaudiofile -gt 500)
{
\&quot;{0}{1}Mo\&quot;-F $folder.fullname,$sizeofaudiofile | Out-File -FilePath c:\audio.txt -Append
}
[/code:1]
Ensuite tu fais trois fois la même chose, parcourir un répertoire et y rechercher certains fichiers.
Il faut reconstruire ton code en parcourant une seule fois le disque et pour chaque type effectuer le traitement.

Quelque chose comme ceci :
[code:1]
#variable contenant les types de fichiers à rechercher
$ext_pattern_All=\&quot;*.mp3\&quot;,\&quot;*.wma\&quot;,\&quot;*.wav\&quot;,\&quot;*.aac\&quot;,\&quot;*.ogg\&quot;,\&quot;*.avi\&quot;,\&quot;*.mpg\&quot;,\&quot;*.mpeg\&quot;,\&quot;*.wmv\&quot;,\&quot;*.mov\&quot;,\&quot;*.divx\&quot;,\&quot;*.mp4\&quot;,\&quot;*.rm\&quot;,\&quot;*.mkv\&quot;,\&quot;*.jpg\&quot;,\&quot;*.jpeg\&quot;,\&quot;*.bmp\&quot;
del c:\Video.txt -force -ea silentlycontinue
del c:\Audio.txt -force -ea silentlycontinue
del c:\Photo.txt -force -ea silentlycontinue


Get-ChildItem -Path \&quot;\\serveur\RepertoiresUtilsateurs\\&quot;|where {$_.PSIsContainer}|Foreach {
#Initialisations
$SizeofAudioFile=0
$SizeofVideoFile=0
$SizeofPhotoFile=0
$NbAudio=0
$NbVideo=0
$NbPhoto=0

$CurrentDir=$_
#afficher le nom du dossiers en cours de traitement
Write-Host $CurrentDir.fullname

Get-ChildItem $CurrentDir.fullname -Recurse -include $ext_pattern_All|Foreach {
$CurrentFile=$_
Switch -Regex ($CurrentFile.Extension) {
\&quot;\.mp3|\.wma|\.wav|\.aac|\.ogg\&quot; {
$sizeofaudiofile+=$CurrentFile.length
$NbAudio++
}

\&quot;\.avi|\.mpg|\.mpeg|\.wmv|\.mov|\.divx|\.mp4|\.rm|\.mkv\&quot; {
$sizeofvideofile+=$CurrentFile.length
$NbVideo++
}

\&quot;\.jpg|\.jpeg|\.bmp\&quot; {
$sizeofphotofile+=$CurrentFile.Length
$NbPhoto++
}

}#Switch
} #$CurrentFile

# Arrondi la taille à 2 décimale
$SizeofAudioFile = [math]::round(($SizeofAudioFile/1MB ), 2)
$SizeofVideoFile = [math]::round(($SizeofVideoFile/1MB ), 2)
$SizeofPhotoFile = [math]::round(($SizeofPhotoFile /1MB ), 2)

if ($SizeofVideoFile -gt 500)
{ \&quot;{0} {1}Mo\&quot; -F $CurrentDir.fullname,$SizeofVideoFile &gt;&gt;c:\Video.txt}
if ($SizeofAudioFile -gt 500)
{ \&quot;{0} {1}Mo\&quot; -F $CurrentDir.fullname,$SizeofAudioFile &gt;&gt;c:\Audio.txt}
if ($SizeofPhotoFile -gt 500)
{ \&quot;{0} {1}Mo\&quot; -F $CurrentDir.fullname,$SizeofPhotoFile &gt;&gt;c:\Photo.txt}

Write-Host \&quot;audio: $NbAudio fichiers $SizeofAudioFile Mo\&quot;
Write-Host \&quot;video: $NbVideo fichiers $SizeofVideoFile Mo\&quot;
Write-Host \&quot;photo: $NbPhoto fichiers $SizeofPhotoFile Mo`r`n\&quot;
} #$CurrentDir
[/code:1]
[edit]
A vérifier.
Il peut encore être amélioré sur certains points mais vérifie déjà si cela réduit le temps de traitement.

ATTENTION les fichiers sont supprimés en début de traitement<br><br>Message édité par: Laurent Dardenne, à: 25/01/09 13:07

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 2 mois #3812 par clem
Réponse de clem sur le sujet Re:Performance de gci ?
Bonjour Laurent,

Je viens de lancer le script avec tes modifs et le temps de traitement est passé à 1h15 environ, c'est déja mieux !

A quels améliorations pensais tu ?

D'autre part, j'aurai besoin d'un petit conseil :

Je souhaiterai, lorsque le seuils des 500 Mo est dépassé, envoyer un mail vers mon adresse par exemple, (de preference en html car je souhaiterais y incorporer un tableau avec les tailles et nb de fichiers trouvés)
Seulement voila, je ne sais pas si la classe net.mail de framework me permet d'envoyer des mails sous exchange, ni si elle gere les mails html.
Quant aux objets com, il y a ce message d'avertissemnt d'outlook qui force à valider manuellement chaque envoi de mails (vu la duree du script, ca devient problématique)

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

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