![]() |
Скрипт парсера потребляет много памяти и не отрабатывает полностью
Добрый вечер всем!
Прошу помощи у знатоков тонкостей работы PoSh. Написал парсер, создающий плейлист одного сайта. Скрипт работает вроде неплохо, правда достаточно долго, но это думаю связано с длительными ответами от сервера. Но при работе скрипта постоянно растёт память, потребляемая PoSh, доходит почти до 2 ГБ. И в какой-то момент процесс просто вырубается, не доработав до конца. При запуске через консоль выскакивает какая-то ошибка, но не успеваю её прочитать, так как консоль тут же закрывается. Если запустить скрипт в ISE, то появляется такая ошибка: ![]() Сам скрипт: Код:
$url = 'http://какой-то сайт' Заранее благодарен за помощь и советы. |
Прежде всего, надо поменьше пайпов и форычей.
Например, что-то в таком духе: Код:
((Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href) -match "html" | Sort-Object -Unique) ` Можно вообще вот так: :) Код:
Sort-Object -Unique -InputObject ((Invoke-WebRequest -UseBasicParsing -Uri $url -TimeoutSec 20).Links.Href -match "html" -replace "(.*html)","http://site`$1") |
DJ Mogarych, спасибо. Заменил первый блок с Invoke-WebRequest.
Но, к сожалению, проблему это не решило. Хотя причину нашел. Это блок : Код:
$n = ($l.ParsedHtml.getElementsByTagName("title") | select IHTMLTitleElement_text).IHTMLTitleElement_text -replace "(.*) смотреть онлайн прямой эфир","`$1" Но почему так происходит, не пойму. |
Цитата:
|
Uragan66, вы можете предоставить примерное содержимое переменной $l?
|
Цитата:
а уж в контексте оптимизации по памяти, направление, куда вы послали даёт ровно противоположный эффект |
Цитата:
|
Sort-Object очень медленный (ну, с поправкой на количество вводных данных, 50 строк то он быстро отсортирует).
Зачем сортировать в начале скрипта, это что важно для дальнейшей обработки? |
Цитата:
Но здесь его медленность большой роли не играет. |
Цитата:
В любом случае каждый блок можно скормить командлету Measure-Object и померять где что и сколько времени занимает. |
Charg, забыл я как-то за Select-Object -Unique.
Сейчас код полностью переписал, работает быстро и утечки памяти больше нет. Но возникла немного другая проблема. Сервер на некоторые ссылки возвращает 404, наверное из-за частых запросов. Добавил в цикл Start-Sleep -s 3, но только общее время работы увеличилось, а ошибки 404 встречаются всёравно. |
Цитата:
Скорее, ошибки в этих «некоторых» url'ах. Попробуйте сформировать их в файл и проверить «ручками». |
Я бы добавил проверку на код ответа и если он не 2** (двухсотые это когда всё ок) - писал в stdout содержимое каждой переменной.
Так же не забывай про автоматическую переменную $error и Start\Stop-Transcript |
Charg, спасибо!
Действительно некоторые url'ы для вторых запросов формировались неправильно, RegExr глючил... Сейчас исправил, вроде всё нормально. Нелёгкое дело отладка скрипта :sclerosis Остался один вопрос нерешенный по данному скрипту. Подскажите, пожалуйста, есть ли возможность на PoSh указать автоматическую вертикальную прокрутку listbox по мере его заполнения ? Пробовал добавлять AutoScrollOffset, консоль ругается. |
Цитата:
Быстрый гугл говорит что по-человечески это не сделать, но можно костылями, типа так (не пробовал): Код:
$listBox1.SelectedIndex = listBox1.Items.Count - 1 Цитата:
|
Цитата:
|
Uragan66, сначала заполняешь листбокс данными, потом вот этот костыль, а уже потом рисуешь листбокс? Должно быть так, если я правильно понимаю.
Ну либо листбокс - неправильный выбор для задачи которую ты решаешь с помощью листбокса. |
Цитата:
|
Цитата:
|
Код такой:
Код:
function GenerateForm { После последней правки, код что выше выложил, автоскроллинг заработал. Правда периодически пропадает содержимое листбокса (кроме последней строки) на несколько секунд. Но это уже мелочи. Большое спасибо всем за советы! |
Время: 19:30. |
Время: 19:30.
© OSzone.net 2001-