Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Скрипт парсера потребляет много памяти и не отрабатывает полностью

Ответить
Настройки темы
PowerShell - [решено] Скрипт парсера потребляет много памяти и не отрабатывает полностью

Старожил


Сообщения: 216
Благодарности: 15

Профиль | Отправить PM | Цитировать


Изменения
Автор: Uragan66
Дата: 15-12-2019
Добрый вечер всем!
Прошу помощи у знатоков тонкостей работы 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

 

Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Прежде всего, надо поменьше пайпов и форычей.

Например, что-то в таком духе:
Код: Выделить весь код
((Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href) -match "html" | Sort-Object -Unique) `
-replace "(.*html)","http://site`$1"
Содержимое реплейса не проверял, потому что не знаю, что этим делается.

Можно вообще вот так:
Код: Выделить весь код
Sort-Object -Unique -InputObject ((Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href -match "html" -replace "(.*html)","http://site`$1")

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Последний раз редактировалось DJ Mogarych, 16-12-2019 в 13:47.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:03, 15-12-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 216
Благодарности: 15

Профиль | Отправить 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
При его замене на Select-String потребление памяти не растёт.
Но почему так происходит, не пойму.

Отправлено: 00:03, 16-12-2019 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Uragan66:
При запуске через консоль выскакивает какая-то ошибка, но не успеваю её прочитать, так как консоль тут же закрывается. »
А Вы сначала запустите консоль PowerShell, а затем уже запускайте в ней скрипт. Тогда не закроется.
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:47, 16-12-2019 | #4


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Uragan66, вы можете предоставить примерное содержимое переменной $l?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 08:56, 16-12-2019 | #5


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
Прежде всего, надо поменьше пайпов и форычей. »
в целом крайне сомнительный совет

а уж в контексте оптимизации по памяти, направление, куда вы послали даёт ровно противоположный эффект

Отправлено: 11:17, 16-12-2019 | #6


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


Цитата Busla:
в целом крайне сомнительный совет »
как и всё, что я советую. успокойтесь.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 12:06, 16-12-2019 | #7


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


Sort-Object очень медленный (ну, с поправкой на количество вводных данных, 50 строк то он быстро отсортирует).
Зачем сортировать в начале скрипта, это что важно для дальнейшей обработки?

Отправлено: 12:46, 16-12-2019 | #8


Старожил


Сообщения: 216
Благодарности: 15

Профиль | Отправить PM | Цитировать


Цитата Charg:
Зачем сортировать в начале скрипта, это что важно для дальнейшей обработки? »
Charg, да, сортируются ссылки, необходимые для последующей обработки. Сервер отдаёт по две одинаковые ссылки, Sort-Object удаляет дубликаты.
Но здесь его медленность большой роли не играет.

Отправлено: 13:16, 16-12-2019 | #9


Аватара для Charg

Ветеран


Сообщения: 2798
Благодарности: 469

Профиль | Отправить PM | Цитировать


Цитата Uragan66:
Сервер отдаёт по две одинаковые ссылки, Sort-Object удаляет дубликаты. »
А Select-Object -Unique чем не устраивает?
В любом случае каждый блок можно скормить командлету Measure-Object и померять где что и сколько времени занимает.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:58, 16-12-2019 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Скрипт парсера потребляет много памяти и не отрабатывает полностью

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Статья - Почему процесс 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




 
Переход