SlideShare a Scribd company logo
1 of 62
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

«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
it-people
 
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
SQALab
 
Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Когда технологий много - iForum 2013
Когда технологий много - iForum 2013
Andrey Listochkin
 
Яндекс.Парковки
Яндекс.ПарковкиЯндекс.Парковки
Яндекс.Парковки
Mikhail Dyachenko
 

Similar to Rubylight Pattern-Matching Solutions (20)

Вывод в топ по поисковым запросам - Apptimist
Вывод в топ по поисковым запросам - ApptimistВывод в топ по поисковым запросам - Apptimist
Вывод в топ по поисковым запросам - Apptimist
 
Коммерческие чатботы (инфы) и что за ними стоит
Коммерческие чатботы (инфы) и что за ними стоитКоммерческие чатботы (инфы) и что за ними стоит
Коммерческие чатботы (инфы) и что за ними стоит
 
Yeoman generator своими руками
Yeoman generator своими рукамиYeoman generator своими руками
Yeoman generator своими руками
 
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
Рост с нуля до 15000 сообщений в секунду. Мучительный и поучительный / Юрий К...
 
Парсер: что? зачем? как?
Парсер: что? зачем? как?Парсер: что? зачем? как?
Парсер: что? зачем? как?
 
IT-рекрутинг: в поисках лучших
IT-рекрутинг: в поисках лучших IT-рекрутинг: в поисках лучших
IT-рекрутинг: в поисках лучших
 
Солянка seo хитростей для работы в арбитраже
Солянка seo хитростей для работы в арбитражеСолянка seo хитростей для работы в арбитраже
Солянка seo хитростей для работы в арбитраже
 
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН«Тотальный контроль производительности» Михаил Юматов, ЦИАН
«Тотальный контроль производительности» Михаил Юматов, ЦИАН
 
Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)Где кончается react native? / Павел Кондратенко (Rambler&Co)
Где кончается react native? / Павел Кондратенко (Rambler&Co)
 
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
CodeFest 2013. Русанов П. — Есть ли жизнь в оффлайне? Кеш, транзакционный лог...
 
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The GrinderИлья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
Илья Евлампиев - Нагрузочное тестирование веб-приложений с помощью The Grinder
 
Производительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформыПроизводительность параметрического поиска на основе опенсорс-платформы
Производительность параметрического поиска на основе опенсорс-платформы
 
Easy selenium test automation on python
Easy selenium test automation on pythonEasy selenium test automation on python
Easy selenium test automation on python
 
Когда технологий много - iForum 2013
Когда технологий много - iForum 2013Когда технологий много - iForum 2013
Когда технологий много - iForum 2013
 
Django. Web project full circle
Django. Web project full circleDjango. Web project full circle
Django. Web project full circle
 
Django. Web project full circle
Django. Web project full circleDjango. Web project full circle
Django. Web project full circle
 
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ruБаба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программирование
 
Яндекс.Парковки
Яндекс.ПарковкиЯндекс.Парковки
Яндекс.Парковки
 

More from Dmitry Buzdin

Developing Useful APIs
Developing Useful APIsDeveloping Useful APIs
Developing Useful APIs
Dmitry Buzdin
 
Continuous Delivery
Continuous Delivery Continuous Delivery
Continuous Delivery
Dmitry Buzdin
 
Introduction to DevOps
Introduction to DevOpsIntroduction to DevOps
Introduction to DevOps
Dmitry Buzdin
 
Thread Dump Analysis
Thread Dump AnalysisThread Dump Analysis
Thread Dump Analysis
Dmitry Buzdin
 
Pragmatic Java Test Automation
Pragmatic Java Test AutomationPragmatic Java Test Automation
Pragmatic Java Test Automation
Dmitry Buzdin
 
Web polyglot programming
Web polyglot programmingWeb polyglot programming
Web polyglot programming
Dmitry Buzdin
 
Code Structural Analysis
Code Structural AnalysisCode Structural Analysis
Code Structural Analysis
Dmitry Buzdin
 

More from Dmitry Buzdin (20)

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

Rubylight Pattern-Matching Solutions