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/
