Mam potrzebę przeanalizowania dużego pliku rozdzielanego potokami w celu policzenia liczby rekordów, których kolumna 5. spełnia i nie spełnia moich kryteriów.Potrzebujesz pomocy w poprawieniu wydajności skryptu analizującego tekst rozdzielany za pomocą PowerShell
PS C:\temp> gc .\items.txt -readcount 1000 | `
? { $_ -notlike "HEAD" } | `
% { foreach ($s in $_) { $s.split("|")[4] } } | `
group -property {$_ -ge 256} -noelement | `
ft –autosize
Polecenie to robi to, co chcę, wracając wyjście tak:
Count Name ----- ---- 1129339 True 2013703 False
Jednak dla pliku testowego 500 MB, to polecenie trwa około 5,5 minuty, aby uruchomić mierzona Measure-Command. Typowy plik ma ponad 2 GB, a oczekiwanie na ponad 20 minut jest niepożądanie długie.
Czy widzisz sposób na poprawę wydajności tego polecenia?
Na przykład, czy istnieje sposób na określenie optymalnej wartości dla ReadCount w Get-Content? Bez tego ukończenie tego samego pliku zajmuje 8,8 minuty.
Czy próbowałeś StreamReader? Myślę, że Get-Content ładuje cały plik do pamięci, zanim zrobi coś z nim. – Gisli
Masz na myśli importując System.IO? – neontapir
Tak, użyj struktury .net, jeśli możesz. Kiedyś czytałem duże pliki dziennika, które SQL Server generuje z dobrymi wynikami. Nie znam żadnego innego sposobu, by wydajnie czytać duże pliki, ale nie jestem ekspertem. – Gisli