Выкатили Polars 2.0: смерть OOM и пощечина DuckDB 🐻‍❄️⚡️

Пока почти вся индустрия по привычке мучает Pandas, команда Polars выкатила фундаментальный релиз 2.0. Теперь движок по умолчанию умеет сбрасывать данные на диск при нехватке памяти, рвёт DuckDB на SQL-бенчмарках и ломает обратную совместимость ради скорости.

1️⃣ Out-of-core и стриминг из коробки Раньше классический сценарий выглядел так: у вас 32 ГБ RAM, вы пытаетесь выполнить LazyFrame.collect() на жирном файле, память забивается под завязку, приходит OOM Killer и убивает процесс.

В 2.0 стриминговый движок работает по дефолту. Как только потребление оперативной памяти переваливает за ≈80%, Polars начинает сбрасывать промежуточные результаты на диск (по умолчанию заложен лимит в 64 ГБ). Сортировки, оконные функции и тяжелые вычисления выражений теперь не роняют скрипт.

⚠️ Но стриминговый движок не гарантирует сохранение исходного порядка строк при операциях вроде join или group_by.

2️⃣ SQL первого класса: DuckDB, у вас проблемы

Polars теперь официально позиционирует SQL как равноправный интерфейс. Под капотом переписали оптимизатор: добавили bloom-фильтры, динамические предикаты, умную перестановку join-ов и устранение общих подпланов.

Команда прогнала стандартные бенчмарки TPC-H и TPC-DS против свежих версий DuckDB и DataFusion. Результат: Polars быстрее почти во всех тестах как по суммарному времени, так и по геометрическому среднему.

Есть детская болячка: на мелких объемах данных вылезает оверхед синхронизации (DuckDB там пока выигрывает). Разработчики признали проблему и пообещали поправить в минорных апдейтах. Но на средних и тяжелых нагрузках цифры впечатляют.

3️⃣ Нативный тип Map (человеческие словари)

Раньше хранить ключ-значение внутри таблицы приходилось через костыльный List(Struct({"key": ..., "value": ...})). Читать и обрабатывать это было мучением.

Теперь завезли нативную поддержку Arrow MapType: pl.Map(key_type, value_type). Появились нормальные человеческие методы для работы со словарями прямо внутри выражений: .map.get(), .map.contains_key(), .map.keys(), .map.values().

Быстро, типизировано, без костылей с распаковкой структур.

4️⃣ Жесткая типизация и заточка под AI-агентов Polars окончательно уходит от неявных приведений типов. Идеология простая: скрипт должен падать сразу, а не через 40 минут расчетов из-за внезапного null или несовпадения схемы.

Для этого докрутили collect_schema(), который проверяет типы и резолвит схему пайплайна вообще без материализации данных. Это киллер-фича для генерации кода через LLM: агент может за миллисекунды проверить сгенерированный запрос на валидность до того, как начнет выполнять операции на терабайтах данных.

🔗 Если сидите на первой версии — читайте миграционный гайд

Выкатили Polars 2.0: смерть OOM и пощечина DuckDB 🐻‍❄️⚡️
Пока почти вся индустрия по привычке мучает Pandas, команда Polars выкатила фундаментальный релиз 2.0 | Сетка — социальная сеть от hh.ru