Question manipulation de fichiers : pb de performances

Plus d'informations
il y a 16 ans 7 mois #5088 par PULVERAIL
Salut à tous,

Ayant résolu mon problème d'accès au fichier avec l'aide de Laurent Dardenne, j'ai transformé mon script de :

[code:1]foreach ($j in $content_first_file) {
$k = $j.split(' ')
$h = $k[2] + \" \" + $k[1] + \" \" + $k[3]
$h | out-file -append $second_file
}[/code:1]

à :

[code:1]gc $first_file |
foreach {
$k = $_.split(' ')
\"{0} {1} {2}\" -F $k[2], $k[1], $k[3]
} |
Out-File -Append $second_file -Encoding Default[/code:1]

Ca marche nikel comme sur des roulettes! B)

Mais je voudrais savoir maintenant si c'est possible d'optimiser le script. Le truc c'est que je migre des scripts Cmd vers PS : avant il me fallait quelques minutes pour créer $second_file, et maintenant il me faut deux bonnes heures avec PS... :(<br><br>Message édité par: Arnaud, à: 17/08/09 17:10

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

Plus d'informations
il y a 16 ans 7 mois #5090 par Laurent Dardenne
Tu peux jouer avec le paramètre -readcount du cmdlet Get-Content.
Avec FileMon de sysinternals on voit, en utilisant readcount, qu'il y a + accès READ suivi de + WRITE.
Je pense que sa valeur influence la taille d'un tampon interne.
Mais peut être que Set-Content est plus efficient, à tester.

Ensuite le shell cmd.exe c'est du code natif codé en C, coté rapidité c'est clair que PS est à la traîne :laugh:

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 7 mois #5091 par PULVERAIL
Lorsque je rajoute le paramètre -readcount à la cmdlet Get-Content, j'ai une erreur qui s'affiche :

[code:1]Method invocation failed because [System.Object[]] doesn't contain a method named 'split'.[/code:1]

Comment je peux y remédier??

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

Plus d'informations
il y a 16 ans 7 mois #5092 par Laurent Dardenne
skeleton18 écrit:

Comment je peux y remédier??

Ainsi, car on reçoit désormais un tableau d'objet et plus une chaîne de caractères :
[code:1]
gc $first_file -readcount 500 -TotalCount 1|
foreach {
$k = ([string]$_).split(' ')
\&quot;{0} {1} {2}\&quot; -F $k[2], $k[1], $k[3]
} |
Out-File -Append $second_file -Encoding Default
[/code:1]
Il faut également préciser le paramètre TotalCount. ReadCount précise le nb de ligne à lire à partir du fichier et TotalCount le nb d'élément à envoyer dans le pipe.

Ce qui amméne un autre pb, on doit dans le foreach-object changer le type de l'élément reçu, qui est un tableau d'objet contenant un seul élément ( cf. -TotalCount 1), en une String.
Désolé, c'est \&quot;les aléas du support en direct\&quot;.
:whistle:

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 7 mois #5106 par PULVERAIL
D'après tes dires, le nouveau script serait :

[code:1]Measure-Command {
gc $first_file -ReadCount 5000 -TotalCount 1 |
ForEach-Object {
$k = ([string]$_).split(' ')
\&quot;{0} {1} {2}\&quot; -F $k[2], $k[1], $k[3]
} |
Out-File -append $second_file -encoding Default
}
[/code:1]
Mais ça ne marche pas... Ca ne me mets que la première du fichier1 dans le fichier2... :-/

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

Plus d'informations
il y a 16 ans 7 mois #5110 par Arnaud Petitjean
Salut Skeleton, salut Laurent !

Nous avons déjà eu par le passé l'occasion de discuter des performances de PowerShell et notamment de l'accès au système de fichiers.

Regarde ce fil de discussion , ça te donnera peut-être des idées ?

Sinon, sers toi de la commande Measure-Command afin de mesurer le temps d'exécution de ton script. Comme ça tu verra facilement si tes modifications sont bénéfiques ou non.

Arnaud<br><br>Message édité par: Arnaud, à: 17/08/09 17:10

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.

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