Чэнь Чжо на мгновение замолк, а затем добавил: — Умножение разреженной матрицы на вектор имеет временную сложность O(N). Даже при десяти тысячах связей компьютер справляется с таким одномерным умножением массива быстрее чем за миллисекунду.
В интернет-кафе Чу Гэ уже сгрыз леденец.
Твердый пластик щелкнул по зубам, возвращая в реальность, и палочка полетела на пол.
Взгляд приковало к крышке из-под лапши, заляпанной красным перцовым маслом.
Там чернели две небрежные строчки формул.
Столичный стартап уже две недели бился над тупиком в базе данных — проблемой, которую лучшие студенты компьютерного факультета Цинхуа сочли неразрешимым аппаратным ограничением.
Однако двенадцатилетнему мальчику хватило пары базовых понятий линейной алгебры, чтобы разнести эту преграду в пух и прах.
— Я понял.
Голос Чу Гэ слегка дрожал.
— Забываем про реляционные запросы. Вытаскиваем все таблицы связей наружу и держим разреженную матрицу в памяти. Все запросы крутим как векторные умножения в оперативке. Получив результат, просто подтягиваем из базы аватару и имя по идентификатору пользователя.
— Именно, — отозвался Чэнь Чжо.
— Но тут есть загвоздка.
Программистское чутье моментально подсказало изъян.
— А знает Б, Б знает В, а В знает А. Это же замкнутый цикл в теории графов. Если векторы будут множиться до бесконечности, разве не возникнет зацикливание, которое сожрет все ресурсы процессора?
— Чу Гэ.
Чэнь Чжо на том конце провода вздохнул с легким раздражением.
— Это инженерная задача, а не теорема. В результатах умножения векторов просто фиксируй в хэш-таблице ID для всех значений больше нуля. На следующем шаге встретишь уже записанный идентификатор — просто пропусти его.
Чэнь Чжо покачал головой.
— Ты же кодер. Не жди, что математическая формула подскажет, сколько рулонов туалетной бумаги требуется. Включи наконец программистский здравый смысл.
Услышав подначку в трубке, Чу Гэ расплылся в улыбке.
— Ладно, я в долгу. На этот раз с меня угощение.
Сложив крышку от лапши вдвое, Чу Гэ бережно спрятал её в карман.
— Вернусь после праздников в Кеда — угощу месячным запасом столовкой еды. Всё, вешаю трубку, надо садиться за этот низкоуровневый фоновый демон памяти.
В трубке пиликнули короткие гудки — Чэнь Чжо даже не успел ответить.
Положив трубку, он качнул головой с легкой улыбкой на губах.
Повернувшись, направился на кухню за миской и палочками — пришло время ужинать.
Больше чем в тысяче километров от Цзэяна, в столице.
В обшарпанном доме неподалеку от Чжунгуаньцуня.
В полумраке комнаты горели лишь тусклые экраны трех или четырех мониторов. За окном то и дело взрывались яркие фейерверки, освещая усеянный окурками и коробками из-под еды навынос пол.
Закутавшись в толстую ватную куртку, Ван Син горбился перед монитором. Налитые кровью глаза неотрывно следили за логами серверной части.
В эту дикую эпоху становления интернета они загорелись идеей создать настоящую студенческую соцсеть с реальными именами. Задумка была великолепной, и Ван Син с партнерами даже сумели выбить ангельские инвестиции в несколько сотен тысяч, имея на руках лишь одну презентацию.
Однако проект застрял намертво из-за технического тупика.
Завтра третий день лунного Нового года, а инвестор требует демоверсию системы, способную выдержать 500 пользователей одновременно.
Ван Син не сомкнул глаз уже трое суток.
Стоило трафику подрасти, как поиски друзей через базу данных лавиной обрушивали всю систему.
В правом нижнем углу экрана замигал значок мессенджера.
Налитые кровью глаза Ван Сина дернулись. Он схватил мышь и кликнул по уведомлению.
Это был Чу Гэ — гениальный хакер из Кеда, застрявший в далеком Хуэйчжоу, которого они привлекли в качестве бесплатной технической поддержки.
— Старик Чу, побереги силы.
Онемевшими пальцами Ван Син набросал ответ и нажал отправить.
— Мы пробовали и кэширование, и индексы. Толку ноль. Реляционная база не вывозит такие многоуровневые сетевые запросы. Железо не справляется.
Через пару секунд Чу Гэ скинул архив.
Файл весил меньше 20 килобайт.
Следом прилетело сообщение от Чу Гэ.
— Сноси весь старый код реляционных запросов. Запускай этот сишный демон на серверном бэкенде.
Ван Син замер на секунду.
— Это что ещё такое?
— Утилита для умножения разреженных матриц прямо в оперативке.
Ответ Чу Гэ был краток.
— Выгружай таблицу связей в обычный текстовик и скармливай ему. Забудь про базу данных для поиска друзей. Кидаешь команду этому процессу — он всё считает в памяти и выдает готовый массив ID.
Ван Син ошеломленно уставился на экран.
Но терять уже было нечего — положение безвыходное, так почему бы не рискнуть?
Приняв файл и распаковав архив, он закинул исходники в компилятор для быстрой проверки.
Стоило заглянуть внутрь, как по спине пробежал холодный пот.
Код поражал лаконичностью. Никаких библиотек для работы с базами данных — лишь низкоуровневая возня с указателями и пара циклов умножения одномерных массивов, в которые он даже не сразу вник.
Ни единого SQL-запроса.
Глубоко вдохнув, Ван Син залил скомпилированный бинарник на тестовый сервер и скормил ему десятки тысяч строк тестовых связей.
Процесс стартовал бесшумно, задействовав меньше 50 мегабайт памяти.
— Поднимай стресс-тест!
Ван Син повернулся к полусонному Ван Хуэйвэню, клюющему носом рядом.
Тот с трудом протер глаза и вбил команду для нагрузочного теста.
— Симулирую 500 параллельных запросов, поиск друзей до третьего круга.

Комментарии

Загрузка...