Получить все строки, содержащие строку в огромном текстовом файле - как можно быстрее?
В Powershell, как читать и как можно быстрее прокручивать последнюю строку (или все строки), которая содержит определенную строку в огромном текстовом файле (около 200000 строк /30 мегабайт)?
Я использую:
get-content myfile.txt | select-string -pattern "my_string" -encoding ASCII | select -last 1
Но это очень очень долго (около 16-18 секунд).
Я выполнил тесты без последнего канала "select -last 1
", но в то же время.
Существует ли более быстрый способ, чтобы получить последнее вхождение (или все вхождения) определенной строки в огромном файле?
Возможно, это необходимое время...
Или есть ли возможность прочитать файл быстрее с конца, так как мне нужно последнее появление?
Благодаря
Ответы
Ответ 1
Попробуйте следующее:
get-content myfile.txt -ReadCount 1000 |
foreach { $_ -match "my_string" }
Это будет читать ваш файл в кусках по 1000 записей за раз и найти совпадения в каждом фрагменте. Это дает вам лучшую производительность, потому что вы не тратите много времени на управление памятью, так как там только 1000 строк за раз.
Ответ 2
Пробовали ли вы использовать [System.IO.File]::ReadAllLines();
? Этот метод более "сырой", чем метод PowerShell-esque, поскольку мы подключаемся непосредственно к типам Microsoft.NET Framework.
$Lines = [System.IO.File]::ReadAllLines();
[Regex]::Matches($Lines, 'my_string_pattern');
Ответ 3
Вы пробовали:
gc myfile.txt | % { if($_ -match "my_string") {write-host $_}}
Или вы можете создать "grep" -подобную функцию:
function grep($f,$s) {
gc $f | % {if($_ -match $s){write-host $_}}
}
Затем вы можете просто выдать: grep $myfile.txt $my_string