

Vlad
24.03.2018
15:31:35
Я о том что например у меня sideikiq воркер обарабатывает один твитер аккаунт в 100 потоков, типа парсит 100 тысяч твитов за 2-3 минуты (цифры так из потолка относительно). Или 100 воркеров парсят 100 сайтов за 3-5 секунд. Но больше начинаются лаги в парсинге, при том, что канал сервера забивается на небольшой процент при этом и CPU тоже.
Даже почему-то скрипт на python который делает подобное работает в 2 раза быстрее. Каждый поток еще работает через прокси при этом. Но иногда упираюсь в потолок, что 100 воркеров sidekiq собирают данные по скорости как 30 воркеров. Я конечно не топ разработчик, дай бог на мидла сойду, поэтому и пытаюсь спросить совета у шарящих людей :)
И почему-то по наблюдениям парсинга руби вообще не очень хорошо работают в этом плане. Даже инициализация воркера до парсинга занимает в Ruby почему-то 3-5 секунд, в python 1-2 секунды. Другие языки не пробовал. В этом и вопрос. Что там про Go/Rust говорят.
Я понимаю что грамотное распределение и масштабирование поможет решить все проблемы. Но хотелось бы начать проблемы не с мастшабирования, ибо сейчас сервак чуть меньше 100$/мес стоит с 32гб памяти, xeon какой- то и так далее, а языка, который работает быстрее чем ruby.


Vladimir
24.03.2018
15:34:30
Я о том что например у меня sideikiq воркер обарабатывает один твитер аккаунт в 100 потоков, типа парсит 100 тысяч твитов за 2-3 минуты (цифры так из потолка относительно). Или 100 воркеров парсят 100 сайтов за 3-5 секунд. Но больше начинаются лаги в парсинге, при том, что канал сервера забивается на небольшой процент при этом и CPU тоже.
Даже почему-то скрипт на python который делает подобное работает в 2 раза быстрее. Каждый поток еще работает через прокси при этом. Но иногда упираюсь в потолок, что 100 воркеров sidekiq собирают данные по скорости как 30 воркеров. Я конечно не топ разработчик, дай бог на мидла сойду, поэтому и пытаюсь спросить совета у шарящих людей :)
И почему-то по наблюдениям парсинга руби вообще не очень хорошо работают в этом плане. Даже инициализация воркера до парсинга занимает в Ruby почему-то 3-5 секунд, в python 1-2 секунды. Другие языки не пробовал. В этом и вопрос. Что там про Go/Rust говорят.
Я понимаю что грамотное распределение и масштабирование поможет решить все проблемы. Но хотелось бы начать проблемы не с мастшабирования, ибо сейчас сервак чуть меньше 100$/мес стоит с 32гб памяти, xeon какой- то и так далее, а языка, который работает быстрее чем ruby.
Слушай, ты не соврал, ты точно Он. Ладно по делу. Если говоришь что CPU и RAM в порядке надо диагностикку провести, это один и тот жне сервер?


Vlad
24.03.2018
15:36:00
Я сам его стебал по поводу парсинга)
Значит я что-то не так делаю, судя по Вашему ответу)

Google

Vladimir
24.03.2018
15:37:25

Andrey
24.03.2018
15:39:04
Один сервер. Видимо

Vladimir
24.03.2018
15:39:36
Кот никому не нужен (это сообщение для видо, он мне на кнопки нажимает, а я угрожаю, что отдам)

Vlad
24.03.2018
15:43:39
Ты уже работаешь, так что там у тебя под капотом?
обычный стек docker, sidekiq, pg, ruby, grape для api на фронте react c api работающий, ну то не важно. я понимаю что надо расширять стек наверное и масштабировать все как-то. но с этим я разберусь. я хочу изначально спросить как парсить многопточно в огромное кол-во потоков)
я не особо и жалуюсь сейчас, хочется прыгнуть выше, 90% времени работы читаю что-то не знаю в каком направлении шагать

Dm
24.03.2018
15:44:36

Vladimir
24.03.2018
15:45:30
Чтобы не созовать всякого геммора вроде блокировок и други семофорв, при использования трединга используй очереди
Есть такая в руби штука

Vlad
24.03.2018
15:45:42
Году в 2009 пользовался спамером одним на перле и допиливал его немного) Не знаю вообще его) Это тест на МАСТЕРА ЛИРа?))

Vladimir
24.03.2018
15:46:06
Сто пудов тест на нег :))

Dm
24.03.2018
15:46:12

Google

Vladimir
24.03.2018
15:46:28
Ну не только в руби.
Очеь жалко что в том же го, регулярки очень долгие, иначе посоветовал бы переписать всё туда, работае после компиляции быстрее, конечно. Прям сильно, но у тебя именно прасинг.
Итак, решение с моей точки зрения:

Andrey
24.03.2018
15:48:58

Vlad
24.03.2018
15:49:01
Регулярок в парсинге нет практически
Nokogiri использую для работы с данными сайтов
Внатуре МАСТЕР ЛИР какой-то получаюсь... )))

Andrey
24.03.2018
15:51:38
И сообщений из одного слова

Vlad
24.03.2018
15:52:22
Ох уж это флудосуббота)))

Vladimir
24.03.2018
15:53:06
1.Множим серваки, на каждому выдаём задачу, мол парсить отсель до сель. Используем трединг, queue. что такое - загуглишь, тыж не Мастер Лир ;))) . В целом рыба такая, получаешь в массив, например, список ссылок, потом создаёшь работающее на твоём железе кол-во воркеров, читай тредов, потом в очередь добавляешь все адреса, и в конце добавляешь.. Ну например слово die по ко-ву воркеров
2. Каждая процедура(тред), получает данные из очереди обрабатыает из, помещаая в очередь результата. Для сохранения результата, создаётся ещё один тред который эту очередь обрабатывает, и пишет в базу/файл. По получению слова die тред умирает
3. По завершению всех тредов, программа закрывается
Могу показать пример

Andrey
24.03.2018
15:56:46
То что ты выше описал вроде сайдкик из коробки делает. Разве нет?

Vladimir
24.03.2018
15:57:07
Я хз что такое сайдкик. Я на голом руби пишу ;)
Напомните пожалуйста, что там за сайт, где удобно выложить код? С гитхабом связан. Я из командной строки умею, а вот так что-то не пользовался

Andrey
24.03.2018
15:59:56
Ну там не надо с тредами работать. Просто пишешь воркер. И ввставляешь настройки типа название очереди, максимальное количество паралельных поток для этой очереди. Сколько раз перезапускать если упадет и т.д.

Vladimir
24.03.2018
16:01:48
Ну, интересно же хнать что внутри? Я пытался даже видимо свой сайдкик написать, типа чтоб любую функцию можно было замногопточить. Он работало, но что-то не так было, не помню, лет 5 прошло. Тоже, наверное, выложить могу

Google

Vladimir
24.03.2018
16:02:23
А вы всей толпой поругаете, я это люблю, очень образовательно

Ro
24.03.2018
16:03:00

Vlad
24.03.2018
16:04:32

Vladimir
24.03.2018
16:04:59

Andrey
24.03.2018
16:05:05

Ro
24.03.2018
16:07:13
А как же то самое? В любом лабиринти всегда поворачива на лево? ;))
есть способы намного проще. Ну т.е. нафига бы я вам стал графы подсовывать, чтобы жизнь сладкой не казалась? Задача хорошая, решение простое. Сделать ее - большой фан. Без графов можно обойтись. Ну и практика тоже поможет. Одному челу недавно похожую задачу задали в гугле

Vladimir
24.03.2018
16:08:23

Vlad
24.03.2018
16:09:35
Я раньше парсингом занимался без skidekiq. Хостинг Vscale выдавал по API сервер за 1-2 рубля в час 4-ядерный. Я через скрипт из базы распределял задачи, а потом создавал сервера по API и на них через Ansible закачивал скрипты с данными и тасками, которые у тебя их обрабатывали и на удаленный сервеак засовывали данные. Выходило быстерее, чем сейчас но неудобно.

Vladimir
24.03.2018
16:13:05
Нашёл сервис. если нужно, скажите, поделюсь своим тред-быдлокодом

Alex
24.03.2018
16:26:41

Vladimir
24.03.2018
16:28:16

Alex
24.03.2018
16:28:29

Vladimir
24.03.2018
16:30:03
Нет ребят, лень искать, но тут нужен стикер "Сарказм"

Alex
24.03.2018
16:30:30
жаль что я не сразу понял
можно дажи пройтись по всем направлениям чтоб наверняка и выбрать самый короткий

Vladimir
24.03.2018
16:31:35

Alex
24.03.2018
16:31:41
оригинальное решение я пока что не понял
как и не понял, почему так плохо юзать рекурсию, понимаю что это не производительно, но ведь никто и не гонится за производительностью в таких задачах. В другом языке я бы мог сделать более элегантное и глупое решение

Google

Dmitry
24.03.2018
16:42:45
Просто об уровне знаний говорит, вот и все.
Сделал сразу и быстро и просто, значит мастер.

Fedor
24.03.2018
16:43:31
у тебя ограниченный стек вызовов

Dmitry
24.03.2018
16:43:47

Fedor
24.03.2018
16:44:08
если ты используешь рекурсию - значит ты не знаешь длинну входящих данных, значит с большой вероятностью твоя программа упадет
и это будет не эксепшен, который можно отловить и выйти, а просто упадет
если по твоему нормально писать код, который самопроизвольно фатально падает, то рекурсия - вполне норм

Admin
ERROR: S client not available

Fedor
24.03.2018
16:44:59
если пишешь на функциональном языке, типа эрланга, то рекурсия вполне норм
во всех остальных случаях она неприменима

Alex
24.03.2018
16:45:18

Fedor
24.03.2018
16:45:53
не надо учиться писать код для поделок, надо учитсья писать нормальный код, который ты потом покажешь на собеседовании что бы тебя взяли на работу
и который потом будет приносить тебе деньги

Alex
24.03.2018
16:46:05
Только я не понимаю как мне решить эту проблему
не используя графы и рекурсию, т.е. оставшись при том же методе ''всегда поворачивай направо если не можешь идти вперед"

Fedor
24.03.2018
16:48:50
тяжело сказать, не зная задачи, но ты можешь просто писать весь пути в массив, к примеру, и в бесконечном цикле просто добавлять в конец массива значения
если надо пойти обратно, просто по шагам удаляй их

Alex
24.03.2018
16:49:07
я как бы так и делаю

Google

Alex
24.03.2018
16:49:16
а вот это интересно

Fedor
24.03.2018
16:49:44
лучше для этого конечно подойдет стек, а не массив, он чутка быстрее, но в руби стеков нет )
хотя можно при желании реализовать, но смысла нет

Alex
24.03.2018
16:50:11
значит вывод, тем алгоритмом что я пытаюсь решить задачу, на RUBY её не решить, правильно?

Fedor
24.03.2018
16:50:14
руби не пр опроизводительность - руби про быстро написанный красивый и хорошо читаемый код
рекурсивно - нет

Alex
24.03.2018
16:50:39
так а иначе её и не решить этим алгоритмом

Fedor
24.03.2018
16:50:53
понимаешь, даже если ты напишешь хвостовую рекрсию, и настроишь компилятор под нее, то он просто преобразует твою рекурсию в бесконечный цикл
но ты сам можешь написать этот цикл, так зачем тогда эти пляски с бубном?

Alex
24.03.2018
16:51:10
я не понимаю
так я уже написал бесконечный цикл
который записывает путь в конец массива

Dmitry
24.03.2018
16:52:01

Alex
24.03.2018
16:52:17

Fedor
24.03.2018
16:53:37
http://wm-help.net/lib/b/book/827961078/264
вот тебе пример решения классической задачи с башнями
рекурсивное и не рекурсивное
разница в том, вызывает ли метод сам себя, или он вызывается в итерациях цикла
все

Alex
24.03.2018
16:54:16
так в руби нет ни рекурсии ни стеков, о чем речь вообще тогда я не пойму этого никак