• Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,482
On Slideshare
0
From Embeds
0
Number of Embeds
6

Actions

Shares
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