Polars的流式模式可以处理大于内存容量的数据集。在这种模式下,Polars会分批次处理您的数据,而不是一次性处理全部数据。(它允许应用程序在数据到达时实时地处理数据,而不是等待所有数据都到达后再进行处理。)然而,流式模式并不是只在内存不足时才使用的紧急开关。对于许多查询来说,流式模式的速度与非流式模式相当或更快。
这意味着,如果你正在处理较大的数据集,特别是如果你正在构建希望未来能够处理更大数据集的管道时,保持流式模式的开启是值得的。
流式处理和非流式处理的简单示例
要在流式模式下工作,我们只需在评估查询时向collect函数传递streaming=True参数。
首先,我们创建一个包含100万个行、100个浮点数列和一个整数ID列的DataFrame。
import polars as plimport numpy as np
N = 1_000_000K = 100
df = (
pl.DataFrame(
np.random.standard_normal((N,K))
)
# Add an ID column .hstack(
pl.DataFrame(
np.random.randint(0,9,(N,1)
)
)
.rename(
{'column_0':'id'}
)
))
然后,我们按照id列进行分组,并计算剩余列的均值。我们通过设置streaming=True参数在流式模式下执行查询。
(
df
.lazy()
.groupby('id')
.agg(
pl.all().mean()
)
.collect(
streaming=True
))
如果我们比较使用streaming=True和streaming=False(默认)的查询,我发现流式模式的平均时间为75毫秒,而非流式模式为120毫秒。相比之下,Pandas完成这个查询大约需要330毫秒。
结论
对于许多查询,流式模式可能是一个很好的默认选择——而不是只有在遇到内存问题时才应该使用的应急按钮。
不过,我不能保证流式模式总是至少与非流式模式一样快,因为Polars中的流式技术仍在开发中,肯定存在流式模式会显著变慢的使用场景。如果你发现这样的情况,非常欢迎你在Polars的discord上讨论。
另外请注意,目前并非所有延迟模式下的操作都支持流式处理,但它确实适用于核心操作,如groupby和join。
往期热门文章:
从 Pandas 到 Polars 二十六:在Polars中,不要遍历列
从 Pandas 到 Polars 二十三:如果你的数据已经排序,Polars可以为你提供助力
从 Pandas 到 Polars 十八:数据科学 2025,对未来几年内数据科学领域发展的预测或展望
从 Pandas 到 Polars 十三:流式处理的关键参数
从 Pandas 到 Polars 十:“Polars 表达式“是什么?