Как улучшить производительность Write-Progress?

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

CREATE   TRANCODE   MPF               OF TXOLID
AGENDA                   = T4XCLCSHINAG
,ANY_SC_LIST              = NONE    ,EVERY_SC_LIST            = NONE
,SECURITY_CATEGORY        = NONE    ,FUNCTION                 = 14
,TRANCODE_VALUE           = "MPF"
,TRANCODE_FUNCTION_MNEMONIC = NONE
,INSTALLATION_DATA        = NONE
;

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

rv Start,Filtered,count,CSV
Write-Host "Reading Mainframe Extract File"
$Start = gc K:\TRANCODES.txt
Write-Host ("Read Complete : " + $Start.Count + " records found")

Write-Host "Filtering records for AGENDA/TRANCODE information"
$Filtered = $Start|Select-String -Pattern "AGENDA","TRANCODE_VALUE"
Write-Host ([String]($Filtered.Count/2) + " AGENDA/TRANCODE pairs found")

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

AGENDA                   = T4XCLCSHINAG
,TRANCODE_VALUE           = "MPF"
AGENDA                   = T4XCLCSHINAG
,TRANCODE_VALUE           = "MP"

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

Measure-Command{$Filtered|foreach {If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

Measure-Command{$Filtered|foreach {If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

rv Start,Filtered,count,CSV  
Write-Host "Reading Mainframe Extract File"  
$Start = gc K:\TRANCODES.txt  
Write-Host ("Read Complete : " + $Start.Count + " records found")  

Write-Host "Filtering records for AGENDA/TRANCODE information"  
$Filtered = $Start|Select-String -Pattern "AGENDA","TRANCODE_VALUE"  
Write-Host ([String]($Filtered.Count/2) + " AGENDA/TRANCODE pairs found")  

Write-Host "Building table from the filter results"  
[int]$count = 0  
$CSV = @()  
$Filtered|foreach {If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

Reading Mainframe Extract File
Read Complete : 94082 records found
Filtering records for AGENDA/TRANCODE information
11759 AGENDA/TRANCODE pairs found
Building table from the filter results
Table built : 11759 rows created
Sorting and Exporting table to CSV file

TotalSeconds      : 75.2279182  

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$Filtered|foreach {If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString() -Match 'AGENDA'){$obj = $null; $obj = New-Object System.Object; $obj | Add-Member -type NoteProperty -name AGENDA -Value

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString().SubString(27)} If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString() -Match 'TRANCODE_VALUE'){$obj | Add-Member -type NoteProperty -name TRANCODE -Value (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString().SubString(28)).Replace('"',''); $CSV += $obj; $obj = $null} $count++ If ($sw.Elapsed.TotalMilliseconds -ge 500) { Write-Progress ` -Activity "Building table of values from filter results" ` -Status ("Processed " + $count + " of " + $Filtered.Count + " records") ` -Id 1 ` -PercentComplete ([int]($count/$Filtered.Count *100)); $sw.Reset(); $sw.Start()} } Write-Progress ` -Activity "Building table of values from filter results" ` -Status ("Table built : " + $CSV.Count + " rows created") ` -Id 1 ` -Completed

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString() -Match 'AGENDA'){$obj = $null; $obj = New-Object System.Object; $obj | Add-Member -type NoteProperty -name AGENDA -Value

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

Reading Mainframe Extract File
Read Complete : 94082 records found
Filtering records for AGENDA/TRANCODE information
11759 AGENDA/TRANCODE pairs found
Building table from the filter results
Table built : 11759 rows created
Sorting and Exporting table to CSV file

TotalSeconds      : 75.2279182  

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$Filtered|foreach {If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString() -Match 'AGENDA'){$obj = $null; $obj = New-Object System.Object; $obj | Add-Member -type NoteProperty -name AGENDA -Value

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString().SubString(27)} If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString() -Match 'TRANCODE_VALUE'){$obj | Add-Member -type NoteProperty -name TRANCODE -Value (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString().SubString(28)).Replace('"',''); $CSV += $obj; $obj = $null} $count++ If ($sw.Elapsed.TotalMilliseconds -ge 500) { Write-Progress ` -Activity "Building table of values from filter results" ` -Status ("Processed " + $count + " of " + $Filtered.Count + " records") ` -Id 1 ` -PercentComplete ([int]($count/$Filtered.Count *100)); $sw.Reset(); $sw.Start()} } Write-Progress ` -Activity "Building table of values from filter results" ` -Status ("Table built : " + $CSV.Count + " rows created") ` -Id 1 ` -Completed

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString().SubString(27)} If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

Reading Mainframe Extract File
Read Complete : 94082 records found
Filtering records for AGENDA/TRANCODE information
11759 AGENDA/TRANCODE pairs found
Building table from the filter results
Table built : 11759 rows created
Sorting and Exporting table to CSV file

TotalSeconds      : 75.2279182  

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

Write-Host "Building table from the filter results"
[int]$count = 0
$CSV = @()
$sw = [System.Diagnostics.Stopwatch]::StartNew()
$Filtered|foreach {If (

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного файла:

[110]

Теперь для каждого из них я забочусь только о значениях AGENDA и TRANCODE_VALUE, поэтому прочитал файл в Get-Content, затем я использую Select-String как наиболее эффективный из известных мне способов отфильтровать остальные строки в файле:

[111]

Это оставляет меня с объектом типа Microsoft.PowerShell.Commands.MatchInfo с содержимое вроде:

[112]

Теперь, когда Select-String занял всего около 9 секунд, так что никакой реальной необходимости в индикаторе прогресса там нет.

Однако следующий шаг, захват фактических значений (после =) и помещение в массив занимает более 30 секунд, поэтому я решил, что Write-Progress полезен для пользователя и, по крайней мере, показывает, что что-то действительно происходит, но добавление индикатора выполнения серьезно увеличивает затраченное время, см. следующий вывод из Measure-Command:

[113]

Так что это 717.2308630680085 записей / сек

[114]

Сейчас только ничтожные 89,98660799693897 записей / с

Есть идеи, как повысить эффективность?

Вот полный сценарий как есть:

[115]

Вот вывод из сценария с write-progress прокомментировал:

[116]

РЕДАКТИРОВАТЬ: Я принял измененную версию ответа от @RomanKuzmin, поэтому соответствующий раздел кода теперь выглядит следующим образом:

[117]

И выполнение всего скрипта через Measure-Command дает истекшее время 75,2279182 секунды без write-progress и с измененным write-progress с использованием предложения @RomanKuzmin 76,525382 секунды - совсем неплохо !! : -)

.ToString() -Match 'AGENDA'){$obj = $null; $obj = New-Object System.Object; $obj | Add-Member -type NoteProperty -name AGENDA -Value

Я пишу сценарий, который берет выходной файл с другой платформы (который, к сожалению, не производит вывод CSV, вместо этого он составляет около 7 строк на запись), собирая строки с интересующими меня значениями (используя select-string), а затем сканирует массив MatchInfo, извлекает точный текст и строит массив, когда я иду, чтобы экспортировать в CSV, когда закончите.

Моя проблема в том, что в исходном файле содержится около 94000 строк текста, а в объекте matchinfo по-прежнему содержится около 23500 записей, поэтому требуется некоторое время, особенно для построения массива, поэтому я решил добавить Write-Progress, но накладные расходы при этом весьма ужасны, они увеличивают истекшее время x8 по сравнению с отсутствием индикатора выполнения.

Вот пример записи из исходного фай

8
задан Graham Gold 22 January 2014 в 23:44
поделиться