为了有效地将大型数据集加载到 Polars 中,可以使用惰性 API 和函数scan_*。当我们执行聚合时,这很有效(因此我们有一个大的输入数据集,但一个小的结果)。但是,如果我想完整地处理一个大数据集(例如,更改列的每一行中的值),似乎无法使用collect整个(结果)数据集并将其加载到内存中。
是否可以直接将 LazyFrame 写入磁盘,并按顺序对数据集的块进行处理,以限制内存使用?
Polars 对流/核心处理的支持不断增加。
要运行查询流,请LazyFrame使用collect(streaming=True) 收集您的信息。
如果结果无法放入内存,请尝试使用 将其写入磁盘sink_parquet。
Polars 的算法不是流式的,因此它们需要内存中的所有数据来进行连接、分组、聚合等操作。因此直接写入磁盘仍会将这些中间DataFrame数据保留在内存中。
当然,您可以做一些事情。根据您执行的查询类型,它可能会导致令人尴尬的并行化。例如,可以轻松地按块计算总和。
您还可以以较小的块处理列。这允许您仍然计算更困难的聚合/计算。
如果您的查询中有很多过滤器,并且 Polars 能够在扫描时执行这些过滤器,那么您的内存压力就会减少到选择性比率。
| 归档时间: |
|
| 查看次数: |
3280 次 |
| 最近记录: |