Выкатили Polars 2.0: смерть OOM и пощечина DuckDB 🐻❄️⚡️
Пока почти вся индустрия по привычке мучает Pandas, команда Polars выкатила фундаментальный релиз 2.0.
Теперь движок по умолчанию умеет сбрасывать данные на диск при нехватке памяти, рвёт DuckDB на SQL-бенчмарках и ломает обратную совместимость ради скорости.
1️⃣ Out-of-core и стриминг из коробки
Раньше классический сценарий выглядел так: у вас 32 ГБ RAM, вы пытаетесь выполнить
В 2.0 стриминговый движок работает по дефолту. Как только потребление оперативной памяти переваливает за ≈80%, Polars начинает сбрасывать промежуточные результаты на диск (по умолчанию заложен лимит в 64 ГБ). Сортировки, оконные функции и тяжелые вычисления выражений теперь не роняют скрипт.
⚠️ Но стриминговый движок не гарантирует сохранение исходного порядка строк при операциях вроде
2️⃣ SQL первого класса: DuckDB, у вас проблемы
Polars теперь официально позиционирует SQL как равноправный интерфейс. Под капотом переписали оптимизатор: добавили bloom-фильтры, динамические предикаты, умную перестановку join-ов и устранение общих подпланов.
Команда прогнала стандартные бенчмарки TPC-H и TPC-DS против свежих версий DuckDB и DataFusion. Результат: Polars быстрее почти во всех тестах как по суммарному времени, так и по геометрическому среднему.
Есть детская болячка: на мелких объемах данных вылезает оверхед синхронизации (DuckDB там пока выигрывает). Разработчики признали проблему и пообещали поправить в минорных апдейтах. Но на средних и тяжелых нагрузках цифры впечатляют.
3️⃣ Нативный тип Map (человеческие словари)
Раньше хранить ключ-значение внутри таблицы приходилось через костыльный
Теперь завезли нативную поддержку Arrow MapType:
Быстро, типизировано, без костылей с распаковкой структур.
4️⃣ Жесткая типизация и заточка под AI-агентов
Polars окончательно уходит от неявных приведений типов. Идеология простая: скрипт должен падать сразу, а не через 40 минут расчетов из-за внезапного
Для этого докрутили
🔗 Если сидите на первой версии — читайте миграционный гайд
Пока почти вся индустрия по привычке мучает 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: агент может за миллисекунды проверить сгенерированный запрос на валидность до того, как начнет выполнять операции на терабайтах данных.🔗 Если сидите на первой версии — читайте миграционный гайд