Question
manipulation de fichiers : pb de performances
- PULVERAIL
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 36
- Remerciements reçus 0
il y a 16 ans 7 mois #5088
par PULVERAIL
manipulation de fichiers : pb de performances a été créé 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!
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
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!
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...
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 7 mois #5090
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:manipulation de fichiers : le retour
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
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
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- PULVERAIL
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 36
- Remerciements reçus 0
il y a 16 ans 7 mois #5091
par PULVERAIL
Réponse de PULVERAIL sur le sujet Re:manipulation de fichiers : le retour
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??
[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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 7 mois #5092
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:manipulation de fichiers : le retour
skeleton18 écrit:
[code:1]
gc $first_file -readcount 500 -TotalCount 1|
foreach {
$k = ([string]$_).split(' ')
\"{0} {1} {2}\" -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 \"les aléas du support en direct\".
Ainsi, car on reçoit désormais un tableau d'objet et plus une chaîne de caractères :Comment je peux y remédier??
[code:1]
gc $first_file -readcount 500 -TotalCount 1|
foreach {
$k = ([string]$_).split(' ')
\"{0} {1} {2}\" -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 \"les aléas du support en direct\".
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- PULVERAIL
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 36
- Remerciements reçus 0
il y a 16 ans 7 mois #5106
par PULVERAIL
Réponse de PULVERAIL sur le sujet Re:manipulation de fichiers : le retour
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(' ')
\"{0} {1} {2}\" -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... :-/
[code:1]Measure-Command {
gc $first_file -ReadCount 5000 -TotalCount 1 |
ForEach-Object {
$k = ([string]$_).split(' ')
\"{0} {1} {2}\" -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.
- Arnaud Petitjean
-
- Hors Ligne
- Modérateur
-
il y a 16 ans 7 mois #5110
par Arnaud Petitjean
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 ?
Réponse de Arnaud Petitjean sur le sujet Re:manipulation de fichiers : le retour
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
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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- manipulation de fichiers : pb de performances