Существует множество способов увеличить скорость выполнения операций, которые можно разбить на возможности в сценариях и вне сценариев:
Возможности вне сценария:
Поскольку файлы имеют большой размер, сколько памяти у компьютера, на котором вы работаете? И максимизируете ли вы его во время этой операции?
Если вы выполняете подкачку на диск, это будет самым большим влиянием на весь процесс!
Если вы есть два способа решения этой проблемы:
- Добавьте больше оборудования для решения проблемы (проще всего с этим справиться)
- Напишите свой код для перебора каждого файла небольшими порциями за раз, поэтому Вы не загружаете все это в ОЗУ одновременно. (очень сложно, если вы не знакомы с ним)
In-Script:
- Не используйте @ () с + = (это очень медленно (особенно на больших наборы данных))
Используйте вместо ArrayList. Вот краткий пример разницы производительности (ArrayList ~ в 40 раз быстрее на 10 000 и в 500 раз быстрее на 100 000 записей, соответственно - эта разница увеличивается с увеличением набора данных, или, другими словами, @() +=
становится медленнее с увеличением набора данных )):
(Measure-Command {
$arr = [System.Collections.ArrayList]::new()
1..100000 | % {
[void]$arr.Add($_)
}
}).TotalSeconds
(Measure-Command {
$arr = @()
1..100000 | % {
$arr += $_
}
}).TotalSeconds
0.8258113
451.5413987
- Если вам нужно выполнить многократный поиск данных на основе ключей, итерации по данным миллионы раз будут медленными. Импортируйте данные как CSV, а затем структурируйте пару хеш-таблиц со связанной информацией с помощью
key -> data
и / или key -> data[]
, и тогда вы сможете выполнять поиск по индексу, вместо того, чтобы повторять массивы миллионы раз ... это будет НАМНОГО быстрее ; при условии, что у вас есть доступная оперативная память для дополнительных объектов ..
РЕДАКТИРОВАТЬ для @RoadRunner:
Мой опыт работы с G C может быть старым ... раньше он был ужасно медленным для больших файлов, но появляется в более новых версиях PowerShell, возможно, были исправлены:
[System.IO.File]::WriteAllLines("$($Env:UserProfile)\Desktop\10MB.txt", ('8' * 10MB))
[System.IO.File]::WriteAllLines("$($Env:UserProfile)\Desktop\50MB.txt", ('8' * 50MB))
[System.IO.File]::WriteAllLines("$($Env:UserProfile)\Desktop\100MB.txt", ('8' * 100MB))
[System.IO.File]::WriteAllLines("$($Env:UserProfile)\Desktop\500MB.txt", ('8' * 500MB))
$10MB = gi .\10MB.txt
$50MB = gi .\50MB.txt
$100MB = gi .\100MB.txt
$500MB = gi .\500MB.txt
0..10 | % {
$n = [pscustomobject] @{
'GC_10MB' = (Measure-Command { Get-Content $10MB }).TotalSeconds
'RAL_10MB' = (Measure-Command { [System.IO.File]::ReadAllLines($10MB) }).TotalSeconds
'GC_50MB' = (Measure-Command { Get-Content $50MB }).TotalSeconds
'RAL_50MB' = (Measure-Command { [System.IO.File]::ReadAllLines($50MB) }).TotalSeconds
'GC_100MB' = (Measure-Command { Get-Content $100MB }).TotalSeconds
'RAL_100MB' = (Measure-Command { [System.IO.File]::ReadAllLines($100MB) }).TotalSeconds
'GC_500MB' = (Measure-Command { Get-Content $500MB }).TotalSeconds
'RAL_500MB' = (Measure-Command { [System.IO.File]::ReadAllLines($500MB) }).TotalSeconds
'Delta_10MB' = $null
'Delta_50MB' = $null
'Delta_100MB' = $null
'Delta_500MB' = $null
}
$n.Delta_10MB = "{0:P}" -f ($n.GC_10MB / $n.RAL_10MB)
$n.Delta_50MB = "{0:P}" -f ($n.GC_50MB / $n.RAL_50MB)
$n.Delta_100MB = "{0:P}" -f ($n.GC_100MB / $n.RAL_100MB)
$n.Delta_500MB = "{0:P}" -f ($n.GC_500MB / $n.RAL_500MB)
$n
}