
📍 Polars 2.0 вышел: стриминг по умолчанию, spill на диск и обгон DuckDB на больших данных 6 октября Ритчи Винк выпустил Polars 2.0. Главное: collect на LazyFrame теперь по умолчанию использует streaming-движок, что даёт заметный выигрыш по памяти и скорости на большинстве запросов. Вместе с ним включён out-of-core: спил на диск начинается примерно при 80% оперативной памяти, бюджет диска по умолчанию 64 ГБ. Сортировка, оконные функции и многие выражения это уже умеют, внешние join и group by в планах. SQL стал полноценным интерфейсом, а оптимизатор получил перестановку join, лучшее устранение общих подпланов и динамические предикаты с фильтрами Блума. Появился нативный dtype Map вместо List(Struct(key, value)) с выражениями map.get, map.contains_key, map.keys и map.values. Бенчмарки на основе TPC-H и TPC-DS (не сравнимы с официальными результатами) показывают, что на SF100 при росте с 16 до 192 vCPU Polars ускоряется в 3,8 раза на TPC-H и в 2,2 раза на TPC-DS, DuckDB 1.5.6 в 3,2 и 1,9 раза, DataFusion в 1,7 и 1,0. Но на SF10 картина честнее: на TPC-H Polars на уровне, а на TPC-DS медленнее в 1,8 раза. Виной постоянный оверхед на 192 потоках, при ограничении 32 ядрами Polars конкурентен везде, исправление обещают в следующем релизе. Самое важное для миграции: streaming-движок по умолчанию не гарантирует порядок строк в join, group_by и unpivot, нужен maintain_order=True. Ошибки теперь всплывают раньше, а неявная обработка несоответствий данных стала опцией. Гайд по апгрейду есть на docs.pola.rs. https://pola.rs/posts/release-polars-2/

