Rust Polars调用reset_string_cache()后能否复用原全局字符串缓存?
关于Rust Polars中reset_string_cache()后复用全局字符串缓存的问题
问题描述
运行以下Rust Polars代码时,由于在创建out2前调用了reset_string_cache(),生成了两个全局字符串缓存。现询问:调用reset_string_cache()后,能否创建使用与out1相同全局字符串缓存的另一分类变量?
use polars_core::prelude::*; use polars_core::{reset_string_cache, toggle_string_cache}; fn main() { let slice1 = &[ Some("foo"), None, Some("bar1"), Some("foo"), Some("foo"), Some("bar1"), ]; let slice2 = &[ Some("foo"), None, Some("bar2"), Some("foo"), Some("foo"), Some("bar2"), ]; toggle_string_cache(true); let ca1 = Utf8Chunked::new("a", slice1); let out1 = ca1.cast(&DataType::Categorical(None)).unwrap(); let out1 = out1.categorical().unwrap().clone(); let rev_map_global1 = out1.get_rev_map(); println!("{:?}", rev_map_global1); reset_string_cache(); let ca2 = Utf8Chunked::new("b", slice2); let out2 = ca2.cast(&DataType::Categorical(None)).unwrap(); let out2 = out2.categorical().unwrap().clone(); let rev_map_global2 = out2.get_rev_map(); println!("{:?}", rev_map_global2); }
回答
不能,原因如下:
reset_string_cache()会直接清空并重置全局字符串缓存,out1原本使用的缓存实例已经被销毁,无法再被后续创建的分类变量复用。- 调用
reset_string_cache()后,后续创建的分类变量(如示例中的out2)会使用全新的全局缓存实例,和out1的缓存完全独立。 - 如果需要让多个分类变量共享同一套字符串映射,应该避免调用
reset_string_cache(),或者手动创建自定义的CategoricalPool,通过DataType::Categorical(Some(Arc::new(pool)))的方式指定共享池,来生成使用同一映射的分类变量。
内容的提问来源于stack exchange,提问作者Kushdesh
相关产品推荐
相关产品推荐

