关于 polars 内存管理的一般问题

general question about polars memory management

我有一些关于 Polars 内存管理的一般性问题。如果你能花几句话说说它是如何工作的,比如什么时候分配内存,什么时候回收内存,那就太好了。

我特别想知道如何从数据帧中删除一些内存。我想以一种即时的方式进行,并且尽可能不通过 Python 垃圾收集机制。如果我必须在之后立即调用 gc.collect() 也不错,但这不是可取的。

我不太明白你的问题,但我会试一试。

python-polars 中,SeriesDataFrame 的删除由 python 的引用计数垃圾回收决定,就像任何其他 python对象。

接下来是 polars 内存也是引用计数的事实。因此,如果我们创建一个新的 DataFrame 从已存在的 DataFrame/Series 复制数据,则不会复制数据,但会增加引用计数。

因此,例如在下面的示例中,我们有 2 个数据帧,共 4 列,但我们在内存中只有 3 列,因为 "a" 列在两个 DataFrame 之间共享。并且只有在引用计数为 0 时才会被删除。

同样的原理也适用于切片Series。切片从不复制数据,而只是增加引用计数并更新 offsetlength 字段。

df_a = pl.DataFrame({
    "a": [1, 2, 3],
    "b": ["a", "b", "c"]
})

df_b = df_a.select(["a", pl.col("b") + "py"])

print(df_a)
print(df_b)
shape: (3, 2)
┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ i64 ┆ str │
╞═════╪═════╡
│ 1   ┆ a   │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ b   │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ c   │
└─────┴─────┘
shape: (3, 2)
┌─────┬─────┐
│ a   ┆ b   │
│ --- ┆ --- │
│ i64 ┆ str │
╞═════╪═════╡
│ 1   ┆ apy │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ 2   ┆ bpy │
├╌╌╌╌╌┼╌╌╌╌╌┤
│ 3   ┆ cpy │
└─────┴─────┘