1Rubylight programmingcontest 1 resultsjug@rubylight.com
Входящие сообщения- What type of iPhone do you have?- Hi, take a look here:http://www.youtube.com/watch?v=RC_6skf1-t- Salu...
Шаблоны (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- Sa...
Интерфейсpublic interface IPatternMatcher {void addPattern(String pattern);String checkText(String text);}
Дополнительно- Оценивается производительностьрешения!- Подробности на сайтах JUG.LV иhttps://wiki.rubylight.com/display/JU...
Зачем это надо- Борьба со спамом в Ask.fm- Анти-вирусные приложения- Network intrusion detectionsystems(NIDS)- Поиск геном...
Простое решениеpublic void addPattern(String pattern) {patternList.add(pattern);}public String checkText(String text) {for...
Поиск одного шаблонаI like IPhones!IPhoneIPhoneIPhoneIPhoneIPhoneIPhoneIPhoneIPhone
`СложностьO(m*p) — в худшем случаеO(m*n) — в лучшем случаеm — длина текстаn — количество шаблоновp — суммарная длина всех ...
Загруженность CPU- 1000 сообщений в секунду- 35 000 шаблонов
Что делать?- Добавлять сервера- Оптимизировать алгоритм
Наше решение- Строим хеш таблицу для шаблонов- Сканируем входной текст по 3 символа- Вычисляем хеш из этих 3 символов- Ище...
Хеш функцияyoutube – hash(you) -> 676phone – hash(pho) -> 4277photo – hash(pho) -> 4277look here – hash(loo) -> 64718
Хеш таблица0...676......4277......64718...65536nullyoutubephoto phonelook herenullnullnullnull
Поиск шаблонаI like phones!I l – hash-> 10234li – hash-> 676 - youtubelik – hash-> 64718ike – hash-> 676Ke – hash-> 52546E...
Хеш функцияpublic int calculateHash(String text, int startIndex) {return (text.charAt(startIndex)*11 +(text.charAt(startIn...
Распределение
Хеш функция IIint calculateHash(String text, int startIndex) {return((text.charAt(startIndex)<<8)*111 +(text.charAt(startI...
Распределение II
Загруженность CPU после- 1000 сообщений в секунду- 35 000 шаблонов
Решение не оптимально- Только 3 первых символа учитываются- Можно использовать Rolling hash- Возможны низкоуровневые оптим...
Оптимальное решение- Сначала достигаем оптимальнойсложности O()- Потом делаем низкоуровневыеоптимизации
Присланные решения- Всего было прислано 17 решений- Участвовало 10 разработчиков- 3 решения не прошли тест- 1 решение выпо...
Тест производительности- 25 000 шаблонов- 1000 000 входящих текстовых сообщений- Сообщения от 3 до 300 любых символов- Шаб...
Финальныйзапуск
Лучшее решение- Trie структура данных (индекс шаблонов)- Низкоуровневая оптимизация- Оптимизирован поиск потомков- Оптимиз...
TrieP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
Поиск потомкаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
Поиск потомкаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)H P T....min: H max: T0 1 8 12....
Поиск потомкаl p yo hhon tne o......otubeoketcmin: l max: ymin: n max: trootmin: n max: t
Обход текста (String)public final class String {private final char value[];private final int offset;private final int coun...
Обход текста (reflection)public PatternMatcher() {valueField_ = String.class.getDeclaredField("value");offsetField = Strin...
Что можно улучшить?- Может занимать много памяти- Поиск подстроки всегда начинается скорня
НаукаMichael Oser Rabin Richard Manning KarpAlfred Aho
Существующие алгоритмы- Aho-Corasick string matching algorithm (1975)- Rabin-Karp string search algorithm (1987)- Commentz...
Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
5Поздравляем победителей!https://wiki.rubylight.com/display/JUGjug@rubylight.com
Все решения1 708ms Aivars Kalvans, Trie с оптимизациями3 205ms Arkadi Shishlov, Aho-Corasick библиотека6 356ms Eugene Igan...
5Rubylight programmingcontest 2jug@rubylight.com
Исходные данные●Highload project, запросы обрабатываютсясотнями серверов●Сервера (инстанции) находятся в облакеAmazon●Плат...
ЗадачаОбработать как можно большезапросов в течении всеговремени теста, затративминимальное количество денегна оплату инст...
Изменение нагрузки
Подсчет прибыли●Чем больше мы обрабатываем запросов, тембольше наша прибыль!●Каждый инстанс может обработать не болеемилли...
При недостаточноймощности●Если текущая мощность (количествоинстанций) недостаточна для текущейнагрузки, количество обработ...
Имплементацияinterface InstanceManager {void loadNotification(long requestCount, CloudAPI cloudApi);}interface CloudAPI {v...
Ограничения●Java 7 (other JVM languages are not allowed)●Open-source Java libraries available in publicMaven repositories●...
Подсчет результата●Тест прогоняется “в течении месяца”●Результат = R – I – F●R – количество обработанных запросов * настои...
Дополнительно●Подробности на сайтах JUG.LV иhttps://wiki.rubylight.com/display/JUG●Решения ждем до 31 Июня 2013●Интересные...
6Ждем ваших решений!Удачи!https://wiki.rubylight.com/display/JUGjug@rubylight.com
Upcoming SlideShare
Loading in...5
×

Rubylight Pattern-Matching Solutions

2,580

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,580
On Slideshare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Rubylight Pattern-Matching Solutions"

  1. 1. 1Rubylight programmingcontest 1 resultsjug@rubylight.com
  2. 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. 3. Шаблоны (patterns)- IPhone- youtube.com/watch- look here- Заходи, сюда- photo
  4. 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. 5. Интерфейсpublic interface IPatternMatcher {void addPattern(String pattern);String checkText(String text);}
  6. 6. Дополнительно- Оценивается производительностьрешения!- Подробности на сайтах JUG.LV иhttps://wiki.rubylight.com/display/JUG- Решения ждем до 31 Мая 2013- Интересные реализации будутрассмотрены и отмечены на следующемсобрании JUG
  7. 7. Зачем это надо- Борьба со спамом в Ask.fm- Анти-вирусные приложения- Network intrusion detectionsystems(NIDS)- Поиск геномов в ДНК- grep/fgrep утилита в Unix
  8. 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. 9. Поиск одного шаблонаI like IPhones!IPhoneIPhoneIPhoneIPhoneIPhoneIPhoneIPhoneIPhone
  10. 10. `СложностьO(m*p) — в худшем случаеO(m*n) — в лучшем случаеm — длина текстаn — количество шаблоновp — суммарная длина всех шаблонов
  11. 11. Загруженность CPU- 1000 сообщений в секунду- 35 000 шаблонов
  12. 12. Что делать?- Добавлять сервера- Оптимизировать алгоритм
  13. 13. Наше решение- Строим хеш таблицу для шаблонов- Сканируем входной текст по 3 символа- Вычисляем хеш из этих 3 символов- Ищем шаблон по хешу
  14. 14. Хеш функцияyoutube – hash(you) -> 676phone – hash(pho) -> 4277photo – hash(pho) -> 4277look here – hash(loo) -> 64718
  15. 15. Хеш таблица0...676......4277......64718...65536nullyoutubephoto phonelook herenullnullnullnull
  16. 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. 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. 18. Распределение
  19. 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. 20. Распределение II
  21. 21. Загруженность CPU после- 1000 сообщений в секунду- 35 000 шаблонов
  22. 22. Решение не оптимально- Только 3 первых символа учитываются- Можно использовать Rolling hash- Возможны низкоуровневые оптимизации
  23. 23. Оптимальное решение- Сначала достигаем оптимальнойсложности O()- Потом делаем низкоуровневыеоптимизации
  24. 24. Присланные решения- Всего было прислано 17 решений- Участвовало 10 разработчиков- 3 решения не прошли тест- 1 решение выполнялось слишком долго- До финала дошло 6 решений- Все, кроме одного — самописные- Коментарии в коде отсутствуют
  25. 25. Тест производительности- 25 000 шаблонов- 1000 000 входящих текстовых сообщений- Сообщения от 3 до 300 любых символов- Шаблоны от 3 до 300 любых символов- Ограничение по памяти 512Mb- Предварительный разогрев- Все взято из реальной системы
  26. 26. Финальныйзапуск
  27. 27. Лучшее решение- Trie структура данных (индекс шаблонов)- Низкоуровневая оптимизация- Оптимизирован поиск потомков- Оптимизирована работа с текстом
  28. 28. TrieP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  29. 29. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  30. 30. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  31. 31. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  32. 32. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  33. 33. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  34. 34. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  35. 35. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  36. 36. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  37. 37. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  38. 38. Trie - поиск шаблонаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)MY IPHONE
  39. 39. Поиск потомкаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  40. 40. Поиск потомкаP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)H P T....min: H max: T0 1 8 12....
  41. 41. Поиск потомкаl p yo hhon tne o......otubeoketcmin: l max: ymin: n max: trootmin: n max: t
  42. 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. 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. 44. Что можно улучшить?- Может занимать много памяти- Поиск подстроки всегда начинается скорня
  45. 45. НаукаMichael Oser Rabin Richard Manning KarpAlfred Aho
  46. 46. Существующие алгоритмы- Aho-Corasick string matching algorithm (1975)- Rabin-Karp string search algorithm (1987)- Commentz-Walter algorithm
  47. 47. Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  48. 48. Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  49. 49. Алгоритм Aho-CorasickP HHOTOOST(PHOTO)(HOST)NE(PHONE)TIP(TIP)
  50. 50. 5Поздравляем победителей!https://wiki.rubylight.com/display/JUGjug@rubylight.com
  51. 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. 52. 5Rubylight programmingcontest 2jug@rubylight.com
  53. 53. Исходные данные●Highload project, запросы обрабатываютсясотнями серверов●Сервера (инстанции) находятся в облакеAmazon●Плата берется за каждый час работы каждогоинстанса●Мы можем програмно стартовать иостанавливать инстансы●Нагрузка в течении дня меняется
  54. 54. ЗадачаОбработать как можно большезапросов в течении всеговремени теста, затративминимальное количество денегна оплату инстанций
  55. 55. Изменение нагрузки
  56. 56. Подсчет прибыли●Чем больше мы обрабатываем запросов, тембольше наша прибыль!●Каждый инстанс может обработать не болеемиллиона запросов в час●Каждый обработаный запрос приносит доход.●Расходы на оплату инстансов вычитаются изприбыли●За недостаточную для текущей нагрузкимощность взимается штраф
  57. 57. При недостаточноймощности●Если текущая мощность (количествоинстанций) недостаточна для текущейнагрузки, количество обработанныхзапросов ограниченно количествоминстанцийй●Кроме этого, взимается штраф,пропорциональный квадрату от разницымежду текущей мощностью и требуемойдля данной нагрузки
  58. 58. Имплементацияinterface InstanceManager {void loadNotification(long requestCount, CloudAPI cloudApi);}interface CloudAPI {void startInstances(int n);void stopInstances(int n);}●Implement InstanceManager●InstanceManager.loadNotification будетвызываться каждый час в симуляторе сколичеством запросов, поступивших запоследний час
  59. 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. 60. Подсчет результата●Тест прогоняется “в течении месяца”●Результат = R – I – F●R – количество обработанных запросов * настоимость запроса●I – сумма расходов на инстанции●F – сумма штрафов
  61. 61. Дополнительно●Подробности на сайтах JUG.LV иhttps://wiki.rubylight.com/display/JUG●Решения ждем до 31 Июня 2013●Интересные реализации будутрассмотрены и отмечены наследующем собрании JUG
  62. 62. 6Ждем ваших решений!Удачи!https://wiki.rubylight.com/display/JUGjug@rubylight.com

×