@rubyschool

Страница 581 из 921
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% времени работы читаю что-то не знаю в каком направлении шагать

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

Есть такая в руби штука

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

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

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
Введение в алгоритм A* / Хабрахабр https://habrahabr.ru/post/331192/
чтобы решить эту задачу не обязательно читать про алгоритмы, т.к. условия соптимизировать путь нет

Vlad
24.03.2018
16:04:32
То что ты выше описал вроде сайдкик из коробки делает. Разве нет?
Так я через Skidekiq и работаю, очереди и все такое

Vladimir
24.03.2018
16:04:59
Andrey
24.03.2018
16:05:05
чтобы решить эту задачу не обязательно читать про алгоритмы, т.к. условия соптимизировать путь нет
Там не только оптимальные пути описаны. Просто посмотреть на подходы к решению. А не тупо циклы друг в друга вкладывать.

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

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: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
так в руби нет ни рекурсии ни стеков, о чем речь вообще тогда я не пойму этого никак

Страница 581 из 921