Обрезка большого текста через Regex сильно нагружает процессор. Можно ли как-то уменьшить?

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
Всем здравствуйте!
Постараюсь описать подробно проблему.
Есть сайт. В нём 1.000.000 строк кода.
Мне нужно с него получать в многопотоке всё, что начинается от начала заголовков и заканчивая закрывающимся тегом </head>
Логично сделать через конструктор регулярных выражений и просто парсить, как я и сделал. Но, это очень сильно нагружает процессор сервера (VPS 8 ядер 2.4Ггц) даже при 10 потоках: http://prntscr.com/ltqqax
Шаблон прикрепил в аттаче.
Я, если честно, не знаю как работают регулярные выражения, но как мне кажется, что ищут они по всему тексту. Можно ли как-то ограничить их поиск, чтобы когда нашёлся текст - больше не искалось.
Ну или может есть какое-то более здравое решение чтобы это всё ускорить?
 

Вложения

backoff

Client
Регистрация
20.04.2015
Сообщения
5 926
Благодарностей
6 389
Баллы
113

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
можно так, без заголовков будет

Заголовки тоже нужны. Хотя там их и от силы даже меньше 1% от всего текста наберётся, на скорость это вообще не повлияет
Т.е. нужны все заголовки и то что в <head>...</head>
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 926
Благодарностей
6 389
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
5 926
Благодарностей
6 389
Баллы
113
ну или так попробуй...

вся проблема в символих {} и []
для регуляоных выражений эти знаки как некие условия, поэтому и тупит, короче можно попробовать просто из переменной их удалить заменой например.
 

Вложения

  • Спасибо
Реакции: Ssmodey

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
ну или так попробуй...

вся проблема в символих {} и []
для регуляоных выражений эти знаки как некие условия, поэтому и тупит, короче можно попробовать просто из переменной их удалить заменой например.
А на удивление пободрее пошло:
http://prntscr.com/ltr34g

А можно ли как-то ну очень резво вырезать первые, допустим 100 строк?
(Вы мне советовали это в одном из топиков, но решения быстрого я так и не нашёл)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
5 926
Благодарностей
6 389
Баллы
113
можно это сделать с помощью кубиков, положить в список, разделяя по строкам, а потом брать первые 100, можно попробовать
но лучше сниппетом, у меня такого к сожалению нет.
 

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
можно это сделать с помощью кубиков, положить в список, разделяя по строкам, а потом брать первые 100, можно попробовать
но лучше сниппетом, у меня такого к сожалению нет.
А разве можно через кубик получить определённое количество строк? http://prntscr.com/ltr9l3
Можно конечно же зациклить на взятие с 1 по 100 строку по порядку, не мне кажется, что это ещё больше утяжелит шаблон
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113
Есть сайт. В нём 1.000.000 строк кода.
Учи xPath, он проще regex. Например, по id браузер находит мгновенно (хотя, в заголовке его обычно не используют).
На крайняк, есть стандартный поиск по атрибутам.
Вообще, парсить страницу регулярками, это бред и гемор. Страница может измениться от смены версии браузера или даже UA.
 
Последнее редактирование:
  • Спасибо
Реакции: Ssmodey

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
Учи xPath, он проще regex. Например, по id браузер находит мгновенно (хотя, в заголовке его обычно не используют).
На крайняк, есть стандартный поиск по атрибутам.
Вообще, парсить страницу регулярками, это бред и гемор. Страница может измениться от смены версии браузера или даже UA.
xPath пока не разбирал, но, а есть ли смысл, если шаблон на post/get?
Страница не изменится, ибо теги head и body, на сколько я знаю, везде есть. И мне нужно вырезать именно всё, что до закрывающегося тега head
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
Есть, но тут потребуется C# и подключение сторонних либ для разбора html.
Как-то всё очень сложно получается, оказывается :-) (да, я не разбираюсь ни в C#, ни вообще в кодинге). Но, неужели нельзя как-то по простому взять да вырезать из переменной очень быстро первые 100 строк кода да закинуть их в ту же переменную?
(я правда писал всё до закрывающегося тега head, но и такой вариант подойдёт)
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 373
Благодарностей
3 297
Баллы
113
Вообще при регулярках, я сначала вырезал необходимые куски, а уже по ним делал поиск.
т.е. сначало получить всё что до первого </head> (его если возможно ещё разделить) и уже делать поиск.

Но желательно ещё прогуглить статьи про оптимизацию регулярок.
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Потестируйте. Два варианта, с регуляркой и без
 

Вложения

  • Спасибо
Реакции: Ssmodey

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28
Вообще при регулярках, я сначала вырезал необходимые куски, а уже по ним делал поиск.
т.е. сначало получить всё что до первого </head> (его если возможно ещё разделить) и уже делать поиск.

Но желательно ещё прогуглить статьи про оптимизацию регулярок.
Меня как раз таки и интересует, как вырезать кусок из большого объёма данных. Естественно я прикрепил не весь свой шаблон, а именно проблемную часть, которая и нагружает процессор, если такие объёмные страницы попадаются. В прикреплённый мной в топике шаблон как раз и вырезает нужную мне часть текста, но очень ресурсозатратно
 

Ssmodey

Client
Регистрация
10.12.2016
Сообщения
129
Благодарностей
27
Баллы
28

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)