Vortex Architecture
Если Lance атакует Parquet со стороны ML workload’ов (random access, vector search), то Vortex атакует Parquet в его родной области — аналитических scan’ах. Vortex предлагает: Parquet-уровень компрессии, 10-20x быстрее сканирование, и главное — compute на сжатых данных без декомпрессии.
Проект создан компанией SpiralDB, передан в Linux Foundation AI & Data в августе 2025. Backers: Microsoft, Snowflake, Palantir, NVIDIA. Файловый формат стабилен с v0.36.0. С января 2026 — core extension в DuckDB (не community, а official).
Vortex — это Rust-реализация, без нативного Python SDK. Основной способ работы — через DuckDB extension: INSTALL vortex; LOAD vortex; SELECT * FROM read_vortex('file.vortex');. Это принципиальное решение: вместо Python-wrapper’а — интеграция с query engine, который понимает compressed compute.
Проблема: декомпрессия как bottleneck
Parquet компрессирует данные (Snappy, ZSTD, LZ4) и декомпрессирует при чтении. Для каждого запроса pipeline выглядит так:
Vortex устраняет шаги 2 и 3: compute выполняется прямо на сжатых данных. Вместо decompress → compute — compressed compute:
Результат: 5-10x быстрее Меньше memory footprint
Результат: тот же ответ, но CPU time: ~50-100ms вместо ~500ms. 5-10x ускорение за счёт отсутствия decompress + decode steps. Memory: compressed representation вместо 3GB decompressed.Extensible Encodings
Ключевой архитектурный принцип Vortex: кодировки — first-class расширяемые объекты, а не фиксированный набор:
Parquet: фиксированные
Parquet: кодировки зафиксированы в спецификации (Thrift). Каждая новая кодировка = изменение Thrift spec + голосование Apache + обновление всех реализаций (Java, C++, Rust, Python). Цикл: 6-18 месяцев.Vortex: pluggable
Vortex: кодировки — pluggable модули. Каждая кодировка = Rust trait implementation + FlatBuffer descriptor. Новая кодировка = новый crate. Нет изменения спецификации формата. Self-describing: reader декодирует WASM decoder из файла.Каталог встроенных кодировок
Vortex включает реализации новейших исследований в области кодирования данных:
Layout Tree
Vortex организует данные в layout tree — дерево из трёх базовых типов layouts, которые компонуются рекурсивно:
Layout Tree (рекурсивное дерево)
Layout tree — рекурсивная структура, описывающая физическую организацию данных в Vortex файле. Каждый узел — один из трёх типов: Struct (колоночное разбиение), Chunked (строковое разбиение), Flat (leaf с данными).Пример layout tree для таблицы с 3 колонками и 2 chunks:
Chunked (root)
Root: Chunked layout. Данные разбиты на 2 chunks по ~1M строк. Каждый chunk обрабатывается независимо: streaming read, per-chunk predicate pushdown, parallel scan.Cascading Compression
Vortex применяет каскадную компрессию — encodings вкладываются друг в друга:
String column: 1M строк, 5 unique
Исходные данные: string колонка 'status' с 5 уникальными значениями в 1M строк. Задача: сжать максимально, сохранив возможность compressed compute.8MB → ~375KB (21x compression) SIMD decode: FastLanes unpack Compressed filter: O(dict_size)
Итого: string column 1M × avg 8 bytes = ~8MB → Dictionary → BitPack → FastLanes = ~375KB + 40 bytes dict. Compression ratio: ~21x. Decode: SIMD FastLanes unpack → index → dictionary lookup. Compressed compute: filter status='shipped' → dict_lookup('shipped')=2 → bitmap scan на BitPacked.Каскадная компрессия — ключевое отличие от Parquet, где dictionary encoding и RLE — “плоские”, не вложенные. В Parquet dictionary-encoded колонка хранит indices как RLE-encoded int32 — два уровня. Vortex допускает произвольную глубину: Dictionary → BitPack → FastLanes → lane permutation. Каждый уровень добавляет сжатие или ускоряет decode.
BtrBlocks-style Codec Selection
Vortex использует подход, вдохновлённый BtrBlocks (SIGMOD 2023): автоматический выбор оптимального каскада кодировок для каждого chunk’а:
Chunk: 64K строк
Входной chunk: ~64K строк одной колонки. Writer анализирует данные перед выбором encoding cascade. Анализ: тип данных, null ratio, cardinality, value range, sortedness, repetition patterns.File Structure
Vortex файл организован как FlatBuffer-описанная структура:
Vortex File (.vortex)
Vortex file: self-describing бинарный формат. FlatBuffer metadata (не Thrift как Parquet, не protobuf как Lance). Структура: data sections → layout tree → footer. Чтение: footer → layout tree → выборочные data sections.WASM Decoders
Для forward compatibility Vortex встраивает WASM decoders в файлы:
Без WASM: reader must know all
Традиционный подход: reader обязан знать все encodings. Если файл использует encoding v2.0, а reader — v1.0, файл нечитаем. Решение: обновить reader. Проблема: файлы-сироты, reader fragmentation.С WASM: decoder в файле
Vortex WASM: файл содержит WASM-модули для декодирования своих encodings. Reader v1 встречает unknown encoding → загружает WASM decoder из файла → выполняет в sandbox → данные декодированы. Self-describing.WASM decoders — forward-looking feature. В текущей версии (v0.36+) WASM decoders описаны в спецификации, но практическое использование ограничено built-in encodings. Основная ценность — для долгосрочного хранения: файлы, записанные сегодня, будут читаемы через 10 лет без обновления reader’а.
DuckDB Integration
С января 2026 Vortex — core extension в DuckDB:
Arrow output → DuckDB result
Результат: Arrow-based output в DuckDB. Compressed compute сэкономил: (1) декомпрессию year column, (2) часть декомпрессии revenue column (pruned chunks), (3) string comparison для region (dict indices вместо strcmp).Использование в DuckDB:
-- Установить и загрузить extension
INSTALL vortex;
LOAD vortex;
-- Чтение Vortex файлов
SELECT * FROM read_vortex('orders.vortex');
-- Запрос с predicate pushdown + compressed compute
SELECT region, SUM(revenue)
FROM read_vortex('s3://bucket/orders.vortex')
WHERE year = 2025
GROUP BY region;
-- Конвертация Parquet → Vortex
COPY (SELECT * FROM read_parquet('orders.parquet'))
TO 'orders.vortex' (FORMAT VORTEX);
Linux Foundation Governance
Vortex передан в LF AI & Data для обеспечения vendor-neutral развития:
Итоги
Vortex — принципиально другой подход к колоночному формату:
В следующем уроке мы детально разберём compressed compute — как Vortex выполняет filter, aggregate и join без декомпрессии, включая late materialization, GPU decode path и TPC-H бенчмарки.