Получить все строки, содержащие строку в огромном текстовом файле - как можно быстрее?

В 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