我可以使用 Polars 处理 DataFrame 而无需在内存中构建整个输出吗?

nar*_*rdi 2 python-polars

为了有效地将大型数据集加载到 Polars 中,可以使用惰性 API 和函数scan_*。当我们执行聚合时,这很有效(因此我们有一个大的输入数据集,但一个小的结果)。但是,如果我想完整地处理一个大数据集(例如,更改列的每一行中的值),似乎无法使用collect整个(结果)数据集并将其加载到内存中。

是否可以直接将 LazyFrame 写入磁盘,并按顺序对数据集的块进行处理,以限制内存使用?

rit*_*e46 7

编辑 (2023-01-08)

Polars 对流/核心处理的支持不断增加。

要运行查询流,请LazyFrame使用collect(streaming=True) 收集您的信息。

如果结果无法放入内存,请尝试使用 将其写入磁盘sink_parquet

旧答案(不再正确)。

Polars 的算法不是流式的,因此它们需要内存中的所有数据来进行连接、分组、聚合等操作。因此直接写入磁盘仍会将这些中间DataFrame数据保留在内存中。

当然,您可以做一些事情。根据您执行的查询类型,它可能会导致令人尴尬的并行化。例如,可以轻松地按块计算总和。

您还可以以较小的块处理列。这允许您仍然计算更困难的聚合/计算。

使用懒惰

如果您的查询中有很多过滤器,并且 Polars 能够在扫描时执行这些过滤器,那么您的内存压力就会减少到选择性比率。