Получайте уникальные записи из больших файлов быстро - PullRequest
0 голосов
/ 08 мая 2018

У меня есть большие файлы (не менее 20 МБ каждый), где мне нужно искать строку M(\d{10})

Ниже приведен скрипт, который я использую:

Get-Content -Path Test.log | %{ [Regex]::Matches($_, "M(\d{10})") } | %{ $_.Value } | select -Unique

Это занимает много времени и требует больше ресурсов процессора, пожалуйста, предложите, как получить результаты с меньшим использованием процессора / быстрее.

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Я бы не использовал несколько раз Foreach-Object, но вместо этого использовал бы Select-String:

(Get-Content -Path Test.log | Select-String "(?<=M)\d{10}").Matches.Value | select -Unique
0 голосов
/ 05 июля 2018

Использование конвейера (потенциально) с эффективным использованием памяти , но медленно .

Для ускорения обработки:

  • избегать конвейера, но это только вариант, если ваши данные помещаются в память в целом - что не должно быть проблемой для файлов размером 20 МБ.

  • отдельно, используйте типы .NET Framework и их методы напрямую, что обычно быстрее, чем использование командлетов .

Применение этих идей к вашему сценарию (синтаксис PSv3 +):

[regex]::Matches(
   [IO.File]::ReadAllText($PWD.ProviderPath + '/Test.log'), 
   'M\d{10}'
).Value | Select-Object -Unique

Обратите внимание, что для удобства по-прежнему используется конвейер с Select-Object -Unique для получения уникальных вхождений, но предполагается, что основная часть обработки - извлечение совпадений регулярных выражений - находится в оптимизированной части оператора ,

0 голосов
/ 08 мая 2018

Просто измерьте себя (чтобы минимизировать разницу эффектов кэша, первое повторяется):

Measure-Command {Get-Content -Path Test.log | %{ [Regex]::Matches($_, "M(\d{10})") } | %{ $_.Value } | select -Unique}

Measure-Command {Get-Content -Path Test.log | %{ [Regex]::Matches($_, "M(\d{10})") } | %{ $_.Value } | select -Unique}

Measure-Command {sls -Path Test.log  "M(\d{10})"  | %{ $_.Matches.Groups[1].Value } | select -Unique}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...