SlideShare a Scribd company logo
1
Rubylight programming
contest 1 results
jug@rubylight.com
Входящие сообщения
- What type of iPhone do you have?
- Hi, take a look here:
http://www.youtube.com/watch?
v=RC_6skf1-t
- Salut est-ce que tu peux aimer ma photo
de profil?
- Привет! У нас сегодня акция. Заходи,
сюда узнаешь больше!
Шаблоны (patterns)
- IPhone
- youtube.com/watch
- look here
- Заходи, сюда
- photo
Проверка по шаблонам
- What type of iPhone do you have?
- Hi, take a look here:
http://www.youtube.com/watch?
v=RC_6skf1-t
- Salut est-ce que tu peux aimer ma photo
de profil?
- Привет! У нас сегодня акция. Заходи,
сюда узнаешь больше!
Интерфейс
public interface IPatternMatcher {
void addPattern(String pattern);
String checkText(String text);
}
Дополнительно
- Оценивается производительность
решения!
- Подробности на сайтах JUG.LV и
https://wiki.rubylight.com/display/JUG
- Решения ждем до 31 Мая 2013
- Интересные реализации будут
рассмотрены и отмечены на следующем
собрании JUG
Зачем это надо
- Борьба со спамом в Ask.fm
- Анти-вирусные приложения
- Network intrusion detection
systems(NIDS)
- Поиск геномов в ДНК
- grep/fgrep утилита в Unix
Простое решение
public void addPattern(String pattern) {
patternList.add(pattern);
}
public String checkText(String text) {
for(String pattern : patternList) {
if(text.contains(pattern)) {
return pattern;
}
}
return null;
}
Поиск одного шаблона
I like IPhones!
IPhone
IPhone
IPhone
IPhone
IPhone
IPhone
IPhone
IPhone
`
Сложность
O(m*p) — в худшем случае
O(m*n) — в лучшем случае
m — длина текста
n — количество шаблонов
p — суммарная длина всех шаблонов
Загруженность CPU
- 1000 сообщений в секунду
- 35 000 шаблонов
Что делать?
- Добавлять сервера
- Оптимизировать алгоритм
Наше решение
- Строим хеш таблицу для шаблонов
- Сканируем входной текст по 3 символа
- Вычисляем хеш из этих 3 символов
- Ищем шаблон по хешу
Хеш функция
youtube – hash(you) -> 676
phone – hash(pho) -> 4277
photo – hash(pho) -> 4277
look here – hash(loo) -> 64718
Хеш таблица
0
...
676
...
...
4277
...
...
64718
...
65536
null
youtube
photo phone
look here
null
null
null
null
Поиск шаблона
I like phones!
I l – hash-> 10234
li – hash-> 676 - youtube
lik – hash-> 64718
ike – hash-> 676
Ke – hash-> 52546
E p – hash-> 3682
ph – hash-> 32568
pho – hash-> 4277 - photo, phone
Хеш функция
public int calculateHash(String text, int startIndex) {
return (text.charAt(startIndex)*11 +
(text.charAt(startIndex + 1) * 13) +
(text.charAt(startIndex + 2) * 29))
% entryArray.length;
}
Распределение
Хеш функция II
int calculateHash(String text, int startIndex) {
return
((text.charAt(startIndex)<<8)*111 +
(text.charAt(startIndex + 1) * 91) +
(text.charAt(startIndex + 2)<<4) * 113)
% entryArray.length;
}
Распределение II
Загруженность CPU после
- 1000 сообщений в секунду
- 35 000 шаблонов
Решение не оптимально
- Только 3 первых символа учитываются
- Можно использовать Rolling hash
- Возможны низкоуровневые оптимизации
Оптимальное решение
- Сначала достигаем оптимальной
сложности O()
- Потом делаем низкоуровневые
оптимизации
Присланные решения
- Всего было прислано 17 решений
- Участвовало 10 разработчиков
- 3 решения не прошли тест
- 1 решение выполнялось слишком долго
- До финала дошло 6 решений
- Все, кроме одного — самописные
- Коментарии в коде отсутствуют
Тест производительности
- 25 000 шаблонов
- 1000 000 входящих текстовых сообщений
- Сообщения от 3 до 300 любых символов
- Шаблоны от 3 до 300 любых символов
- Ограничение по памяти 512Mb
- Предварительный разогрев
- Все взято из реальной системы
Финальный
запуск
Лучшее решение
- Trie структура данных (индекс шаблонов)
- Низкоуровневая оптимизация
- Оптимизирован поиск потомков
- Оптимизирована работа с текстом
Trie
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Trie - поиск шаблона
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
MY IPHONE
Поиск потомка
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
Поиск потомка
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
H P T....
min: H max: T
0 1 8 12....
Поиск потомка
l p y
o hh
o
n tn
e o
..
....
o
t
u
b
e
o
k
etc
min: l max: y
min: n max: t
root
min: n max: t
Обход текста (String)
public final class String {
private final char value[];
private final int offset;
private final int count;
public char charAt(int index) {
if ((index < 0) || (index >= count)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index + offset];
}
}
Обход текста (reflection)
public PatternMatcher() {
valueField_ = String.class.getDeclaredField("value");
offsetField = String.class.getDeclaredField("offset");
valueField_.setAccessible(true);
offsetField.setAccessible(true);
}
public String checkText(String text) {
chars = (char [])valueField_.get(text);
offset = offsetField.getInt(text);
// work with chars[] and offset
...
}
Что можно улучшить?
- Может занимать много памяти
- Поиск подстроки всегда начинается с
корня
Наука
Michael Oser Rabin Richard Manning KarpAlfred Aho
Существующие алгоритмы
- Aho-Corasick string matching algorithm (1975)
- Rabin-Karp string search algorithm (1987)
- Commentz-Walter algorithm
Алгоритм Aho-Corasick
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
Алгоритм Aho-Corasick
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
Алгоритм Aho-Corasick
P H
H
O
T
O
O
S
T
(PHOTO)
(HOST)
N
E
(PHONE)
T
I
P
(TIP)
5
Поздравляем победителей!
https://wiki.rubylight.com/display/JUG
jug@rubylight.com
Все решения
1 708ms Aivars Kalvans, Trie с оптимизациями
3 205ms Arkadi Shishlov, Aho-Corasick библиотека
6 356ms Eugene Igans, RadixTrie
12 140ms Reinis Reinikovs, Trie + TreeMap для потомков
19 353ms Kiril Menshikov, Trie +?
56 220ms Deniss Mosičkins, Rolling hash
5
Rubylight programming
contest 2
jug@rubylight.com
Исходные данные
●
Highload project, запросы обрабатываются
сотнями серверов
●
Сервера (инстанции) находятся в облаке
Amazon
●
Плата берется за каждый час работы каждого
инстанса
●
Мы можем програмно стартовать и
останавливать инстансы
●
Нагрузка в течении дня меняется
Задача
Обработать как можно больше
запросов в течении всего
времени теста, затратив
минимальное количество денег
на оплату инстанций
Изменение нагрузки
Подсчет прибыли
●
Чем больше мы обрабатываем запросов, тем
больше наша прибыль!
●
Каждый инстанс может обработать не более
миллиона запросов в час
●
Каждый обработаный запрос приносит доход.
●
Расходы на оплату инстансов вычитаются из
прибыли
●
За недостаточную для текущей нагрузки
мощность взимается штраф
При недостаточной
мощности
●
Если текущая мощность (количество
инстанций) недостаточна для текущей
нагрузки, количество обработанных
запросов ограниченно количеством
инстанцийй
●
Кроме этого, взимается штраф,
пропорциональный квадрату от разницы
между текущей мощностью и требуемой
для данной нагрузки
Имплементация
interface InstanceManager {
void loadNotification(long requestCount, CloudAPI cloudApi);
}
interface CloudAPI {
void startInstances(int n);
void stopInstances(int n);
}
●
Implement InstanceManager
●
InstanceManager.loadNotification будет
вызываться каждый час в симуляторе с
количеством запросов, поступивших за
последний час
Ограничения
●
Java 7 (other JVM languages are not allowed)
●
Open-source Java libraries available in public
Maven repositories
●
Pure Java - No native code
●
No filesystem and network access
●
Single threaded
●
-Xmx512m
Подсчет результата
●
Тест прогоняется “в течении месяца”
●
Результат = R – I – F
●
R – количество обработанных запросов * на
стоимость запроса
●
I – сумма расходов на инстанции
●
F – сумма штрафов
Дополнительно
●
Подробности на сайтах JUG.LV и
https://wiki.rubylight.com/display/JUG
●
Решения ждем до 31 Июня 2013
●
Интересные реализации будут
рассмотрены и отмечены на
следующем собрании JUG
6
Ждем ваших решений!
Удачи!
https://wiki.rubylight.com/display/JUG
jug@rubylight.com

More Related Content

Similar to Rubylight Pattern-Matching Solutions (20)

PDF
Вывод в топ по поисковым запросам - Apptimist
Sergey Sharov
 
PPTX
Коммерческие чатботы (инфы) и что за ними стоит
ChatBotCamp
 
PPTX
Yeoman generator своими руками
chaykaborya
 
PDF
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
Ontico
 
PPTX
Парсер: что? зачем? как?
STEP Computer Academy (Zaporozhye)
 
PDF
IT-рекрутинг: в поисках лучших
IT-Доминанта
 
PDF
Солянка seo хитростей для работы в арбитраже
NaZapad
 
PDF
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
 
PPT
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Ontico
 
PDF
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest
 
PPT
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
SQALab
 
PDF
Производительность параметрического поиска на основе опенсорс-платформы
Yandex
 
PDF
Easy selenium test automation on python
Mykhailo Poliarush
 
PDF
Когда технологий много - iForum 2013
Andrey Listochkin
 
PPT
Django. Web project full circle
Olexiy Strashko
 
PPT
Django. Web project full circle
webriders
 
PDF
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Yandex
 
PPT
Эффективное программирование на NodeJS
Yura Bogdanov
 
PDF
Про асинхронное сетевое программирование
Python Meetup
 
PPT
Яндекс.Парковки
Mikhail Dyachenko
 
Вывод в топ по поисковым запросам - Apptimist
Sergey Sharov
 
Коммерческие чатботы (инфы) и что за ними стоит
ChatBotCamp
 
Yeoman generator своими руками
chaykaborya
 
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
Ontico
 
Парсер: что? зачем? как?
STEP Computer Academy (Zaporozhye)
 
IT-рекрутинг: в поисках лучших
IT-Доминанта
 
Солянка seo хитростей для работы в арбитраже
NaZapad
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Ontico
 
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
SQALab
 
Производительность параметрического поиска на основе опенсорс-платформы
Yandex
 
Easy selenium test automation on python
Mykhailo Poliarush
 
Когда технологий много - iForum 2013
Andrey Listochkin
 
Django. Web project full circle
Olexiy Strashko
 
Django. Web project full circle
webriders
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Yandex
 
Эффективное программирование на NodeJS
Yura Bogdanov
 
Про асинхронное сетевое программирование
Python Meetup
 
Яндекс.Парковки
Mikhail Dyachenko
 

More from Dmitry Buzdin (20)

PDF
How Payment Cards Really Work?
Dmitry Buzdin
 
PDF
Как построить свой фреймворк для автотестов?
Dmitry Buzdin
 
PDF
How to grow your own Microservice?
Dmitry Buzdin
 
PDF
How to Build Your Own Test Automation Framework?
Dmitry Buzdin
 
PDF
Delivery Pipeline for Windows Machines
Dmitry Buzdin
 
PPTX
Big Data Processing Using Hadoop Infrastructure
Dmitry Buzdin
 
PDF
JOOQ and Flyway
Dmitry Buzdin
 
PDF
Developing Useful APIs
Dmitry Buzdin
 
PPTX
Whats New in Java 8
Dmitry Buzdin
 
PDF
Dart Workshop
Dmitry Buzdin
 
PPTX
Continuous Delivery
Dmitry Buzdin
 
PPTX
Introduction to DevOps
Dmitry Buzdin
 
PDF
Thread Dump Analysis
Dmitry Buzdin
 
PDF
Pragmatic Java Test Automation
Dmitry Buzdin
 
PDF
Mlocjs buzdin
Dmitry Buzdin
 
PDF
Web polyglot programming
Dmitry Buzdin
 
PPTX
Code Structural Analysis
Dmitry Buzdin
 
PDF
Google Guava
Dmitry Buzdin
 
PPT
Jug Intro 20
Dmitry Buzdin
 
PDF
Jug intro 18
Dmitry Buzdin
 
How Payment Cards Really Work?
Dmitry Buzdin
 
Как построить свой фреймворк для автотестов?
Dmitry Buzdin
 
How to grow your own Microservice?
Dmitry Buzdin
 
How to Build Your Own Test Automation Framework?
Dmitry Buzdin
 
Delivery Pipeline for Windows Machines
Dmitry Buzdin
 
Big Data Processing Using Hadoop Infrastructure
Dmitry Buzdin
 
JOOQ and Flyway
Dmitry Buzdin
 
Developing Useful APIs
Dmitry Buzdin
 
Whats New in Java 8
Dmitry Buzdin
 
Dart Workshop
Dmitry Buzdin
 
Continuous Delivery
Dmitry Buzdin
 
Introduction to DevOps
Dmitry Buzdin
 
Thread Dump Analysis
Dmitry Buzdin
 
Pragmatic Java Test Automation
Dmitry Buzdin
 
Mlocjs buzdin
Dmitry Buzdin
 
Web polyglot programming
Dmitry Buzdin
 
Code Structural Analysis
Dmitry Buzdin
 
Google Guava
Dmitry Buzdin
 
Jug Intro 20
Dmitry Buzdin
 
Jug intro 18
Dmitry Buzdin
 
Ad

Rubylight Pattern-Matching Solutions