关于 polars 内存管理的一般问题
general question about polars memory management
我有一些关于 Polars 内存管理的一般性问题。如果你能花几句话说说它是如何工作的,比如什么时候分配内存,什么时候回收内存,那就太好了。
我特别想知道如何从数据帧中删除一些内存。我想以一种即时的方式进行,并且尽可能不通过 Python 垃圾收集机制。如果我必须在之后立即调用 gc.collect() 也不错,但这不是可取的。
我不太明白你的问题,但我会试一试。
在 python-polars
中,Series
或 DataFrame
的删除由 python 的引用计数垃圾回收决定,就像任何其他 python对象。
接下来是 polars 内存也是引用计数的事实。因此,如果我们创建一个新的 DataFrame
从已存在的 DataFrame/Series
复制数据,则不会复制数据,但会增加引用计数。
因此,例如在下面的示例中,我们有 2 个数据帧,共 4 列,但我们在内存中只有 3 列,因为 "a"
列在两个 DataFrame
之间共享。并且只有在引用计数为 0 时才会被删除。
同样的原理也适用于切片Series
。切片从不复制数据,而只是增加引用计数并更新 offset
和 length
字段。
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 │
└─────┴─────┘
我有一些关于 Polars 内存管理的一般性问题。如果你能花几句话说说它是如何工作的,比如什么时候分配内存,什么时候回收内存,那就太好了。
我特别想知道如何从数据帧中删除一些内存。我想以一种即时的方式进行,并且尽可能不通过 Python 垃圾收集机制。如果我必须在之后立即调用 gc.collect() 也不错,但这不是可取的。
我不太明白你的问题,但我会试一试。
在 python-polars
中,Series
或 DataFrame
的删除由 python 的引用计数垃圾回收决定,就像任何其他 python对象。
接下来是 polars 内存也是引用计数的事实。因此,如果我们创建一个新的 DataFrame
从已存在的 DataFrame/Series
复制数据,则不会复制数据,但会增加引用计数。
因此,例如在下面的示例中,我们有 2 个数据帧,共 4 列,但我们在内存中只有 3 列,因为 "a"
列在两个 DataFrame
之间共享。并且只有在引用计数为 0 时才会被删除。
同样的原理也适用于切片Series
。切片从不复制数据,而只是增加引用计数并更新 offset
和 length
字段。
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 │
└─────┴─────┘