Your SlideShare is downloading. ×
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Rubylight Pattern-Matching Solutions
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Rubylight Pattern-Matching Solutions

2,545

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,545
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 1Rubylight programmingcontest 1 resultsjug@rubylight.com
  • 2. Входящие сообщения- 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 photode profil?- Привет! У нас сегодня акция. Заходи,сюда узнаешь больше!
  • 3. Шаблоны (patterns)- IPhone- youtube.com/watch- look here- Заходи, сюда- photo
  • 4. Проверка по шаблонам- 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 photode profil?- Привет! У нас сегодня акция. Заходи,сюда узнаешь больше!
  • 5. Интерфейсpublic interface IPatternMatcher {void addPattern(String pattern);String checkText(String text);}
  • 6. Дополнительно- Оценивается производительностьрешения!- Подробности на сайтах JUG.LV иhttps://wiki.rubylight.com/display/JUG- Решения ждем до 31 Мая 2013- Интересные реализации будутрассмотрены и отмечены на следующемсобрании JUG
  • 7. Зачем это надо- Борьба со спамом в Ask.fm- Анти-вирусные приложения- Network intrusion detectionsystems(NIDS)- Поиск геномов в ДНК- grep/fgrep утилита в Unix
  • 8. Простое решение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;}
  • 9. Поиск одного шаблонаI like IPhones!IPhoneIPhoneIPhoneIPhoneIPhoneIPhoneIPhoneIPhone
  • 10. `СложностьO(m*p) — в худшем случаеO(m*n) — в лучшем случаеm — длина текстаn — количество шаблоновp — суммарная длина всех шаблонов
  • 11. Загруженность CPU- 1000 сообщений в секунду- 35 000 шаблонов
  • 12. Что делать?- Добавлять сервера- Оптимизировать алгоритм
  • 13. Наше решение- Строим хеш таблицу для шаблонов- Сканируем входной текст по 3 символа- Вычисляем хеш из этих 3 символов- Ищем шаблон по хешу
  • 14. Хеш функцияyoutube – hash(you) -> 676phone – hash(pho) -> 4277photo – hash(pho) -> 4277look here – hash(loo) -> 64718
  • 15. Хеш таблица0...676......4277......64718...65536nullyoutubephoto phonelook herenullnullnullnull
  • 16. Поиск шаблонаI like phones!I l – hash-> 10234li – hash-> 676 - youtubelik – hash-> 64718ike – hash-> 676Ke – hash-> 52546E p – hash-> 3682ph – hash-> 32568pho – hash-> 4277 - photo, phone
  • 17. Хеш функцияpublic int calculateHash(String text, int startIndex) {return (text.charAt(startIndex)*11 +(text.charAt(startIndex + 1) * 13) +(text.charAt(startIndex + 2) * 29))% entryArray.length;}
  • 18. Распределение
  • 19. Хеш функция IIint calculateHash(String text, int startIndex) {return((text.charAt(startIndex)<<8)*111 +(text.charAt(startIndex + 1) * 91) +(text.charAt(startIndex + 2)<<4) * 113)% entryArray.length;}
  • 20. Распределение II
  • 21. Загруженность CPU после- 1000 сообщений в секунду- 35 000 шаблонов
  • 22. Решение не оптимально- Только 3 первых символа учитываются- Можно использовать Rolling hash- Возможны низкоуровневые оптимизации
  • 23. Оптимальное решение- Сначала достигаем оптимальнойсложности O()- Потом делаем низкоуровневыеоптимизации
  • 24. Присланные решения- Всего было прислано 17 решений- Участвовало 10 разработчиков- 3 решения не прошли тест- 1 решение выполнялось слишком долго- До финала дошло 6 решений- Все, кроме одного — самописные- Коментарии в коде отсутствуют
  • 25. Тест производительности- 25 000 шаблонов- 1000 000 входящих текстовых сообщений- Сообщения от 3 до 300 любых символов- Шаблоны от 3 до 300 любых символов- Ограничение по памяти 512Mb- Предварительный разогрев- Все взято из реальной системы
  • 26. Финальныйзапуск
  • 27. Лучшее решение- Trie структура данных (индекс шаблонов)- Низкоуровневая оптимизация- Оптимизирован поиск потомков- Оптимизирована работа с текстом
  • 28. TrieP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  • 29. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 30. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 31. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 32. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 33. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 34. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 35. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 36. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 37. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 38. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  • 39. Поиск потомкаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  • 40. Поиск потомкаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)H P T....min: H max: T0 1 8 12....
  • 41. Поиск потомкаl p yo hhon tne o......otubeoketcmin: l max: ymin: n max: trootmin: n max: t
  • 42. Обход текста (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];}}
  • 43. Обход текста (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...}
  • 44. Что можно улучшить?- Может занимать много памяти- Поиск подстроки всегда начинается скорня
  • 45. НаукаMichael Oser Rabin Richard Manning KarpAlfred Aho
  • 46. Существующие алгоритмы- Aho-Corasick string matching algorithm (1975)- Rabin-Karp string search algorithm (1987)- Commentz-Walter algorithm
  • 47. Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  • 48. Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  • 49. Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  • 50. 5Поздравляем победителей!https://wiki.rubylight.com/display/JUGjug@rubylight.com
  • 51. Все решения1 708ms Aivars Kalvans, Trie с оптимизациями3 205ms Arkadi Shishlov, Aho-Corasick библиотека6 356ms Eugene Igans, RadixTrie12 140ms Reinis Reinikovs, Trie + TreeMap для потомков19 353ms Kiril Menshikov, Trie +?56 220ms Deniss Mosičkins, Rolling hash
  • 52. 5Rubylight programmingcontest 2jug@rubylight.com
  • 53. Исходные данные●Highload project, запросы обрабатываютсясотнями серверов●Сервера (инстанции) находятся в облакеAmazon●Плата берется за каждый час работы каждогоинстанса●Мы можем програмно стартовать иостанавливать инстансы●Нагрузка в течении дня меняется
  • 54. ЗадачаОбработать как можно большезапросов в течении всеговремени теста, затративминимальное количество денегна оплату инстанций
  • 55. Изменение нагрузки
  • 56. Подсчет прибыли●Чем больше мы обрабатываем запросов, тембольше наша прибыль!●Каждый инстанс может обработать не болеемиллиона запросов в час●Каждый обработаный запрос приносит доход.●Расходы на оплату инстансов вычитаются изприбыли●За недостаточную для текущей нагрузкимощность взимается штраф
  • 57. При недостаточноймощности●Если текущая мощность (количествоинстанций) недостаточна для текущейнагрузки, количество обработанныхзапросов ограниченно количествоминстанцийй●Кроме этого, взимается штраф,пропорциональный квадрату от разницымежду текущей мощностью и требуемойдля данной нагрузки
  • 58. Имплементацияinterface InstanceManager {void loadNotification(long requestCount, CloudAPI cloudApi);}interface CloudAPI {void startInstances(int n);void stopInstances(int n);}●Implement InstanceManager●InstanceManager.loadNotification будетвызываться каждый час в симуляторе сколичеством запросов, поступивших запоследний час
  • 59. Ограничения●Java 7 (other JVM languages are not allowed)●Open-source Java libraries available in publicMaven repositories●Pure Java - No native code●No filesystem and network access●Single threaded●-Xmx512m
  • 60. Подсчет результата●Тест прогоняется “в течении месяца”●Результат = R – I – F●R – количество обработанных запросов * настоимость запроса●I – сумма расходов на инстанции●F – сумма штрафов
  • 61. Дополнительно●Подробности на сайтах JUG.LV иhttps://wiki.rubylight.com/display/JUG●Решения ждем до 31 Июня 2013●Интересные реализации будутрассмотрены и отмечены наследующем собрании JUG
  • 62. 6Ждем ваших решений!Удачи!https://wiki.rubylight.com/display/JUGjug@rubylight.com

×