В своей основной работе я инженер данных. Но в свободное время я приручаю волшебных существ. Это история о том, как все началось семь недель назад…
$ npm i -g pxi # short version for the impatient
Семь недель назад я пришел на работу, и передо мной стояла та же повторяющаяся задача, с которой я сталкивался несколько месяцев назад: внесение небольших изменений в большие файлы данных, запись новых файлов данных, внесение небольших изменений в… вы поняли. Вы знаете, я инженер данных, и обработка данных — это наша работа. Естественно, у нас есть много программ, которые могут нам помочь, и всего неделю назад я сбросил последнюю. Почему я бросил это?
Что ж, у всех инструментов есть свои плюсы и минусы, но у некоторых есть свои особенности: они слишком медленные, используют самодельные языки обработки, которые я никогда полностью не изучаю, хотя использую их годами, читают весь файл данных перед его обработкой, тем самым зависая мой терминал, потому что это гигабайты данных… Так что я начал писать крошечные скрипты на полноценном языке программирования для каждой новой задачи.
КОНЕЦ
Нет, не совсем.
Я продолжаю возвращаться к написанию собственных сценариев каждые несколько месяцев или около того, но каждый раз прихожу к одному и тому же выводу: это занимает слишком много времени, не масштабируется, а писать одноразовый код просто неинтересно. Я пришел домой рано и расстроился в тот день, запоем посмотрел сериал Netflix, поиграл в несколько игр с друзьями, и у меня не было никакой мотивации делать что-либо еще.
Может быть, вы знаете эти дни, сокрушаясь о том, что раньше все было лучше, как вы были мотивированы, как вам нужен перерыв — к счастью, приближалось Рождество, и в этом году у меня был длинный отпуск.
Всего через неделю мир стал совершенно другим. Мотивация вернулась, тусовки становились скучными, и мне нужен был небольшой проект по программированию, чтобы развлекаться. Что-то, что было весело. Что-то, что будет продолжаться. Что-то, что помогло бы мне. Что-то, что может решить проблему. Может быть, даже для других людей…
Внимательный читатель может догадаться, к чему все идет:
Давайте напишем инструмент обработки данных
Итак, какие же функции нужны «идеальному инструменту обработки данных»?
- Это должно быть быстро.
- Оно должно быть небольшим и сфокусированным — делай одно дело и делай это хорошо.
- Он должен соответствовать стандартам, таким как использование потокового интерфейса, поэтому он хорошо сочетается с существующими инструментами.
- Он должен поддерживать более одного формата — мне больше не нужно переключать инструменты для разных форматов!
- Он должен быть расширяемым, чтобы в будущем я мог добавить другие форматы данных.
- Он определенно должен использовать существующий язык программирования — нет времени изобретать велосипед.
Две недели каникул, и крошечная программка начала складываться. Он был маленьким, он был быстрым, иногда он работал как по волшебству, но если он терпел неудачу, он получал озорное удовольствие, раздражая меня. Я назову его пикси!
function pxi (data) { const chunks = chunk(data) const jsons = deserialize(chunks) const jsons2 = apply(f, jsons) const string = serialize(jsons2) process.stdout.write(string) }
С самого начала пикси была очень быстрой. Честно говоря, я был удивлен тем, как легко было победить основные инструменты, такие как jq
, fx
и mlr
, в простых задачах. Но пикси еще предстояло вырасти в возможностях, чтобы конкурировать в более сложных задачах.
Поэтому я сделал две вещи, чтобы обеспечить устойчивый путь роста:
- Я добавил огромное количество модульных тестов.
- Отслеживание производительности я начал с бенчмарков.
Я надеялся, что в какой-то момент я даже смогу конкурировать с awk
. Я знаю, что это притянуто за уши, но я все равно добавил его в свои тесты.
Совершенно невероятно! pxi
уже победил awk
!
Здоровое подозрение
Я инженер-программист. И это приходит со здоровым подозрением, если все пойдет слишком гладко. И победить awk
на такой ранней стадии было уже чересчур:
$ awk --version awk version 20070501
Какие? Шутки в сторону? MacOS 10.15 в 2019 году поставляется с версией awk
12-летней давности? Позор тебе, Эппл! Итак, после установки GNU awk
:
$ awk --version GNU Awk 5.0.1 (June 18th 2019)
Все вернулось к норме. Как и ожидалось, Пикси оказалась намного медленнее, чем awk
. Теперь я мог приступить к улучшению производительности по-настоящему.
Сравнительный анализ производительности
Сегодняшний день. Семь недель спустя. Теперь Пикси можно приручить. Его озорная природа исчезла. И стало намного быстрее. Он даже превосходит GNU awk
в некоторых тестах:
Я так многому научился за последние семь недель, но не буду вдаваться в подробности, это для другого времени и другого поста. Pixie теперь говорит о JSON, CSV, TSV и SSV, и у меня есть длинный список форматов, которые я хочу когда-нибудь узнать. К сожалению, мой отпуск заканчивается завтра, и у меня будет меньше времени.
На данный момент Pixie находится в очень хорошей форме и почти готов для версии 1.0. Он небольшой, быстрый, расширяемый, универсальный и использует JavaScript в качестве языка обработки. Я очень рекомендую вам попробовать. Но посмотрите сами:
Итак, после семи недель работы я приближаюсь к версии 1.0. И все, что остается, это сказать вам: в городе появился новый ребенок. Это пикси!
$ npm i -g pxi