• Архитектура и алгоритмы индексации аудиозаписей ВКонтакте



      Расскажем о том, как устроен поиск похожих треков среди всех аудиозаписей ВКонтакте.

      Зачем всё это надо?


      У нас действительно много музыки. Много — это больше 400 миллионов треков, которые весят примерно 4 ПБ. Если загрузить всю музыку из ВКонтакте на 64 ГБ айфоны, и положить их друг на друга, получится башня выше Эйфелевой. Каждый день в эту стопку нужно добавлять еще 25 айфонов — или 150 тысяч новых аудиозаписей объёмом 1.5 ТБ.

      Конечно, далеко не все эти файлы уникальны. У каждого аудио есть данные об исполнителе и названии (опционально — текст и жанр), которые пользователь заполняет при загрузке песни на сайт. Премодерации нет. В результате мы получаем одинаковые песни под разными названиями, ремиксы, концертные и студийные записи одних и тех же композиций, и, конечно, совсем неверно названные треки.

      Если научиться достаточно точно находить одинаковые (или очень похожие) аудиозаписи, можно применять это с пользой, например:

      • не дублировать в поиске один трек под разными названиями;
      • предлагать прослушать любимую композицию в более высоком качестве;
      • добавлять обложки и текст ко всем вариантам песни;
      • усовершенствовать механизм рекомендаций;
      • улучшить работу с жалобами владельцев контента.

      Читать дальше →
    • Насколько медленны iostreams?

        Потоки ввода-вывода в стандартной библиотеке C++ просты в использовании, типобезопасны, устойчивы к утечке ресурсов, и позволяют простую обработку ошибок. Однако, за ними закрепилась репутация «медленных». Этому есть несколько причин, таких как широкое использование динамической аллокации и виртуальных функций. Вообще, потоки — одна из самых древних частей стандартной библиотеки (они начали использоваться примерно в 1988 году), и многие решения в них сейчас воспринимаются как «спорные». Тем не менее, они широко используются, особенно когда надо написать какую-то простую программу, работающую с текстовыми данными.

        Вопрос производительности iostreams не праздный. В частности, с проблемой производительности консольного ввода-вывода можно столкнуться в системах спортивного программирования, где даже применив хороший алгоритм, можно не пройти по времени только из-за ввода-вывода. Я также встречался с этой проблемой при обработке научных данных в текстовом формате.

        Сегодня в комментариях у посту возникло обсуждение о медленности iostreams. В частности, freopen пишет
        Забавно смотреть на ваши оптимизации, расположенные по соседству со считыванием через cin :)

        а aesamson даёт такую рекомендацию
        Можно заменить на getchar_unlocked() для *nix или getchar() для всех остальных.
        getchar_unlocked > getchar > scanf > cin, где ">" означает быстрее.


        В этом посте я развею и подтвержу некоторые мифы и дам пару рекомендаций.
        Читать дальше →
      • 8 ловушек программирования



          Эта статья содержит те ловушки программирования, в которые я попадал сам, продолжаю попадать и возможно никогда не прекращу, а также те, в которых я находил своих товарищей.

          Однако я верю в то, что их можно избежать, если знать в какие ловушки можно попасть и как из них выбираться. Возможно эта вера — очередная ловушка.
          Читать дальше →
        • Про кофе и про Web, или почему PHP — велосипед

          Нет-нет. Статья не про отношение к написанию велосипедов на PHP, а именно о том, что PHP — велосипед сам по себе. И нет, автор не пытается примкнуть к тем неленивым, которые хотят PHP пнуть. Вернее будет сказать, что пнуть автор собирается не только PHP. Осторожно: статья крайне многословная.

          PHP — достаточно уникальное явление современности. PHP обладает низким порогом вхождения, PHP хорош тем, что тра-ля-ля, тра-ля-ля. Вы и сами всё это знаете лучше меня. Именно на PHP крутится огромное количество сайтов и блогов, создатели которых не имеют порою совершенно никакого понятия о программировании. Joomla и Wordpress тому яркое подтверждение. И я говорю именно о создателях таких сайтов, а не об авторах этих движков. Однако, без какого-либо сарказма, отмечу, что PHP действительно хорош во многом, и лично я не могу считать его абсолютным злом в байт-коде. Просто многие, ну очень-очень многие почему-то забывают, что PHP — всего лишь шаблонизатор.

          Да нууу?
        • GitPHP в Badoo

            Badoo — это проект с гигантским git-репозиторием, в котором есть тысячи веток и тегов. Мы используем сильно модифицированный GitPHP (http://gitphp.org) версии 0.2.4, над которой сделали множество надстроек (включая интеграцию с нашим workflow в JIRA, организацию процесса ревью и т.д.). В целом нас этот продукт устраивал, пока мы не стали замечать, что наш основной репозиторий открывается более 20 секунд. И сегодня мы расскажем о том, как мы исследовали производительность GitPHP и каких результатов добились, решая эту проблему.

            Расстановка таймеров


            При разработке badoo.com в девелоперском окружении мы используем весьма простую debug-панель для расстановки таймеров и отладки SQL-запросов. Поэтому первым делом мы переделали ее в GitPHP и стали измерять время выполнения участков кода, не учитывая вложенные таймеры. Вот так выглядит наша debug-панель:



            В первой колонке находится имя вызываемого метода (или действия), во второй — дополнительная информация: аргументы для запуска, начало вывода команды и trace. В последнем столбце находится потраченное на вызов время (в секундах).
            Читать дальше →
          • Мне кажется, я начал понимать, что ты имела в виду!

              Опечататься дело нехитрое; опечататься в поисковом запросе так и вдвойне. Почитай все большие веб-поисковики сегодня умеют корректировать ошибки в ключевых словах во-1х и подсказывать запросы во-2х; вслед за ними того же хочется поискам поменьше. Обе штуки можно ловко реализовать при помощи открытого поисковика по кличке Sphinx; в этом посте расскажу, как конкретно.

              Ну, за did you mean («что ты имела в виду») и прочий query completion («уж не Васю ли ты ищешь»).
              Читать дальше →
            • Обучение программированию на Java


                Я собираюсь переучить на Java-программистов миллион человек.
                Я собрал команду и сделал обучающий сервис, которым могу гордиться.
                Рад сообщить, что теперь стать программистом легко, независимо от образования и опыта.

                Но обо всем по порядку, много картинок
              • Пишем сервер на php

                  Собрался вчера и написал заново сервер на сокетах, чтобы, наконец, полностью отделить логику протокола от манипуляций с сокетами. В итоге получилась библиотека классов, которую благополучно выложил на гугле под LGPL.
                  Читать дальше →