|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Скрипт парсера потребляет много памяти и не отрабатывает полностью |
|
|
PowerShell - [решено] Скрипт парсера потребляет много памяти и не отрабатывает полностью
|
Старожил Сообщения: 216 |
Профиль | Отправить PM | Цитировать
Добрый вечер всем!
Прошу помощи у знатоков тонкостей работы PoSh. Написал парсер, создающий плейлист одного сайта. Скрипт работает вроде неплохо, правда достаточно долго, но это думаю связано с длительными ответами от сервера. Но при работе скрипта постоянно растёт память, потребляемая PoSh, доходит почти до 2 ГБ. И в какой-то момент процесс просто вырубается, не доработав до конца. При запуске через консоль выскакивает какая-то ошибка, но не успеваю её прочитать, так как консоль тут же закрывается. Если запустить скрипт в ISE, то появляется такая ошибка: Сам скрипт: $url = 'http://какой-то сайт' $file = New-TemporaryFile $d = '#EXTM3U' (Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href | Where {$_ -match "html"} | Sort-Object -Unique ` | ForEach {$_ -replace "(.*html)","http://этот сайт`$1"} | Out-File $file.FullName Get-Content $file.FullName -Encoding utf8 | ForEach { $l = Invoke-WebRequest -Uri $_ -TimeoutSec 20 if ($l.Content -notmatch "iframe src") { $n = ($l.ParsedHtml.getElementsByTagName("title") | select IHTMLTitleElement_text).IHTMLTitleElement_text -replace "(.*) смотреть онлайн прямой эфир","`$1" $ln = ($l.ParsedHtml.getElementsByTagName("iFrame") | select IHTMLFrameBase_src).IHTMLFrameBase_src ForEach ($link in $ln) { ((Invoke-WebRequest -UseBasicParsing -URI $link -Headers @{"Referer"="$_"}).Content | Select-String -Pattern 'file:"([^"]+)"' -AllMatches).Matches ` | ForEach-Object {"$($_.Groups[1].Value)"}| ForEach {$_ -replace "(https?.*)","#EXTINF:-1,$n`n`$1"} | Out-File .\parser.txt -Append -Encoding utf8 } } else { $n = ($l.ParsedHtml.getElementsByTagName("title") | select IHTMLTitleElement_text).IHTMLTitleElement_text -replace "(.*) смотреть онлайн прямой эфир","`$1" $ln = ($l.ParsedHtml.getElementsByTagName("iFrame") | select IHTMLFrameBase_src).IHTMLFrameBase_src ForEach ($link in $ln) { ((Invoke-WebRequest -UseBasicParsing -URI $link -Headers @{"Referer"="$_"}).Content | Select-String -Pattern 'var videoLink.*(https?[^"]+m3u8)' -AllMatches).Matches ` | ForEach-Object {"$($_.Groups[1].Value)"}| ForEach {$_ -replace "(https?.*)","#EXTINF:-1,$n`n`$1"} | Out-File .\parser.txt -Append -Encoding utf8 } } } $c = Get-Content .\parser.txt -Encoding utf8 Set-Content .\parser.txt -Encoding utf8 -value $d,$c Заранее благодарен за помощь и советы. |
|
Отправлено: 21:33, 15-12-2019 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Прежде всего, надо поменьше пайпов и форычей.
Например, что-то в таком духе: ((Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href) -match "html" | Sort-Object -Unique) ` -replace "(.*html)","http://site`$1" Можно вообще вот так: |
------- Последний раз редактировалось DJ Mogarych, 16-12-2019 в 13:47. Отправлено: 22:03, 15-12-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 216
|
Профиль | Отправить PM | Цитировать DJ Mogarych, спасибо. Заменил первый блок с Invoke-WebRequest.
Но, к сожалению, проблему это не решило. Хотя причину нашел. Это блок : $n = ($l.ParsedHtml.getElementsByTagName("title") | select IHTMLTitleElement_text).IHTMLTitleElement_text -replace "(.*) смотреть онлайн прямой эфир","`$1" $ln = ($l.ParsedHtml.getElementsByTagName("iFrame") | select IHTMLFrameBase_src).IHTMLFrameBase_src Но почему так происходит, не пойму. |
Отправлено: 00:03, 16-12-2019 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Uragan66:
|
|
Отправлено: 03:47, 16-12-2019 | #4 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Uragan66, вы можете предоставить примерное содержимое переменной $l?
|
|
------- Отправлено: 08:56, 16-12-2019 | #5 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
а уж в контексте оптимизации по памяти, направление, куда вы послали даёт ровно противоположный эффект |
|
Отправлено: 11:17, 16-12-2019 | #6 |
fascinating rhythm Сообщения: 6491
|
Профиль | Отправить PM | Цитировать Цитата Busla:
|
|
------- Отправлено: 12:06, 16-12-2019 | #7 |
Ветеран Сообщения: 2798
|
Профиль | Отправить PM | Цитировать Sort-Object очень медленный (ну, с поправкой на количество вводных данных, 50 строк то он быстро отсортирует).
Зачем сортировать в начале скрипта, это что важно для дальнейшей обработки? |
Отправлено: 12:46, 16-12-2019 | #8 |
Старожил Сообщения: 216
|
Профиль | Отправить PM | Цитировать Цитата Charg:
Но здесь его медленность большой роли не играет. |
|
Отправлено: 13:16, 16-12-2019 | #9 |
Ветеран Сообщения: 2798
|
Профиль | Отправить PM | Цитировать Цитата Uragan66:
В любом случае каждый блок можно скормить командлету Measure-Object и померять где что и сколько времени занимает. |
|
Отправлено: 13:58, 16-12-2019 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Статья - Почему процесс System потребляет так много памяти в Windows 10? | OSZone | Microsoft Windows 10 | 1 | 19-08-2015 20:05 | |
Службы - svchost.exe потребляет слишком много памяти | GIGABAIT | Microsoft Windows 7 | 7 | 17-04-2015 11:02 | |
MSFT SQL Server - MS SQL потребляет много оперативной памяти | Tonny_Bennet | Программирование и базы данных | 22 | 23-10-2013 08:13 | |
Групповая политика сопоставление дисков не полностью отрабатывает | snioo | Windows Server 2012/2012 R2 | 5 | 16-07-2013 11:01 | |
Службы - HelpSvc.exe потребляет много оперативной памяти | Котяра | Microsoft Windows 2000/XP | 5 | 18-07-2008 14:41 |
|