Есть ли способ оптимизации кода PowerShell ниже (он объединяет отдельные строки за строкой, содержащейся в связке текстовых файлов, в один):
$ErrorActionPreference = "Continue"
Start-Transcript -path D:\0xAC1CC07A.log -append
$OutFile = "D:\0xAC1CC07A.txt"
echo "filtering 0xAC1CC07A"
ForEach ($filenm in ((get-childitem -Path D:\FILES\* -include ubuntlive1mb_?????_201509*.txt -recurse -force)))
{
$filenm.fullName;
(Get-Content $filenm) | select-string "0xAC1CC07A" | Add-Content $OutFile
}
Stop-Transcript
Он хорошо справляется с небольшими рабочими нагрузками, но на 160 КБ текстовых файлов (всего более 200 ГБ) работает на моей виртуальной машине Win2008R2 более 4 дней. Удивительно, но Ubuntu 14.04 на аналогичном виртуальном оборудовании выполнила свою работу в течение 4 часов:
grep --no-filename "0xac1cc07a" ./FILES/ubuntlive1mb_?????_201509*.txt >>./0xAC1CC07A.txt
Или точнее:
find ./FILES -name "ubuntlive1mb_?????_201509*.txt" -type f -print0 | xargs -0 grep --no-filename "0xac1cc07a" $1 >>./0xAC1CC07A.txt
Я не хорош ни в PowerShell, ни в * nix, все вышеперечисленные сценарии были созданы путем поиска в Google и вставки копий.
Windows box оптимизирована для файловой системы, отключив имена файлов dos и обновление каталога в списке. Ubuntu была только что установлена из коробки.