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

$ 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, в простых задачах. Но пикси еще предстояло вырасти в возможностях, чтобы конкурировать в более сложных задачах.

Поэтому я сделал две вещи, чтобы обеспечить устойчивый путь роста:

  1. Я добавил огромное количество модульных тестов.
  2. Отслеживание производительности я начал с бенчмарков.

Я надеялся, что в какой-то момент я даже смогу конкурировать с 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

Посетите пикси на Github

https://github.com/Yord/pxi

Посетите пикси на npm

https://www.npmjs.com/package/pxi