Если вы действительно собираетесь работать с текстовыми файлами объемом несколько гигабайт, не используйте PowerShell.Даже если вы найдете способ прочитать его быстрее, обработка большого количества строк в PowerShell все равно будет медленной, и вы не можете избежать этого.Даже простые циклы стоят дорого, скажем, для 10 миллионов итераций (вполне реально в вашем случае) у нас есть:
# "empty" loop: takes 10 seconds
measure-command { for($i=0; $i -lt 10000000; ++$i) {} }
# "simple" job, just output: takes 20 seconds
measure-command { for($i=0; $i -lt 10000000; ++$i) { $i } }
# "more real job": 107 seconds
measure-command { for($i=0; $i -lt 10000000; ++$i) { $i.ToString() -match '1' } }
ОБНОВЛЕНИЕ: Если вы все еще не боитесь, попробуйте использовать.NET читатель:
$reader = [System.IO.File]::OpenText("my.log")
try {
for() {
$line = $reader.ReadLine()
if ($line -eq $null) { break }
# process the line
$line
}
}
finally {
$reader.Close()
}
ОБНОВЛЕНИЕ 2
Есть комментарии о, возможно, лучше / короче код.В исходном коде с for
нет ничего плохого, и это не псевдокод.Но самый короткий (самый короткий?) Вариант цикла чтения -
$reader = [System.IO.File]::OpenText("my.log")
while($null -ne ($line = $reader.ReadLine())) {
$line
}