?

Log in

No account? Create an account
 
 
12 March 2019 @ 05:10 pm
"PowerShell: Учимся читать"  
Задача:
Вычитать файл N-ного объема и найти там строку "CATS".

Решение:
Вариант 1.
Для тех, кто никуда не спешит:
Get-Content -Path "C:\Files\somefile.txt" | Select-String -Pattern "CATS"

Плюсы: просто и тупо.
Минусы: УЖАСНО медленно.

Вариант 2.
Для тех у кого ОЧЕНЬ много памяти:
$myfile = Get-Content -Path "C:\Files\somefile.txt"
$myfile | Select-String -Pattern "CATS"

Плюсы: ОЧЕНЬ быстро.
Минусы: Жрёт ОЧЕНЬ много памяти.

Вариант 3.
Компромиссный:
$file = "C:\Files\somefile.txt"
$FileStream = New-Object -TypeName IO.FileStream -ArgumentList ($file), ([System.IO.FileMode]::Open), ([System.IO.FileAccess]::Read), ([System.IO.FileShare]::Read);
$ReadMyFile = New-Object -TypeName System.IO.StreamReader -ArgumentList ($FileStream, [System.Text.Encoding]::ASCII, $true);
$ReadMyFile.BaseStream.Position = 0;
while($ReadMyFile.EndOfStream -eq $false){
$line = $ReadMyFile.ReadLine()
$line | Select-String -Pattern "CATS"
}

Работает от 3 до 5 раз(!) быстрее, чем вариант 1.

__
 
 
 
Poison: defaulthrenov_drummer on March 12th, 2019 04:56 pm (UTC)
На что только люди не пойдут, лишь бы юниксовыми командами не пользоваться.

Ради интереса создал рандомный текстовичок на 1.4ГБ, ~20млн. строк. Примерно в середину внедрил строку STRING2

ozzy@z80-02 ~/git/push$ time grep STRING2 /cygdrive/d/rnd.txt
STRING2

real 0m1.412s
user 0m0.889s
sys 0m0.483s

ozzy@z80-02 ~/git/push$ time cat /cygdrive/d/rnd.txt > /dev/null

real 0m7.825s
user 0m0.015s
sys 0m0.577s

И это bash, cat и grep cygwin'овые, а не нормальные, все происходит на виндовой машине.

На этой же машине дождаться выполнения первой конструкции мне не удалось, ну очень долго это.
Вторая конструкция действительно сожрала всю память и еще попросила, дождаться выполнения опять же не удалось.
Третью конструкцию дождаться тоже не удалось. Вотта фак, неужели в PS НАСТОЛЬКО все плохо?

У тебя, кстати, в третьей конструкции ошибка, $line лишний.

Edited at 2019-03-12 05:17 pm (UTC)
Хвостат Хвостатычhvostat_hvostat on March 12th, 2019 05:18 pm (UTC)
>У тебя, кстати, в третьей конструкции ошибка, $line лишний.

Дэ?

Копировал из IDE, сейчас перепроверю.

UPD:
Всё в полном порядке, ощибок никаих нет, всё выполняется как надо.

Edited at 2019-03-12 05:21 pm (UTC)
Poison: defaulthrenov_drummer on March 12th, 2019 05:29 pm (UTC)
Похоже, это я при копировании налажал.
Что, впрочем, не отменяет того факта, что PS работает крайне странно.
Хвостат Хвостатычhvostat_hvostat on March 12th, 2019 05:30 pm (UTC)
>PS работает крайне странно.

Что же вас так настораживает, коллега?
Poisonhrenov_drummer on March 12th, 2019 05:32 pm (UTC)
То, что для выполнения простейшей операции этому поделию нужно очень много ресурсов.
Хвостат Хвостатычhvostat_hvostat on March 12th, 2019 05:32 pm (UTC)
Ну оно ж форточное! )))
Poisonhrenov_drummer on March 12th, 2019 05:33 pm (UTC)
Но хоть какие-то приличия надо же соблюдать :)))
euthanasepam: Delirium_Tremenseuthanasepam on March 12th, 2019 06:30 pm (UTC)
+

Специально зашёл в этот уютный чатик написать про cygwin и его grep (cat и пр.).
notes4myfamily on March 13th, 2019 04:04 am (UTC)
спасибо, сложил в закрома
(никогда не знаешь какой инструмент когда понадобится. )