You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为LazyCsvReader设置线程数?

如何为LazyCsvReader设置线程数?

嘿,我来帮你搞定这个问题!在Polars里,LazyCsvReader是延迟执行的,它本身并没有直接设置线程数的方法——实际的读取和计算操作都是等到你调用collect()的时候才会触发,所以线程数的配置主要是针对后续LazyFrame的并行计算来设置的,有两种常用方式:

1. 全局设置线程数

如果你希望整个程序里所有Polars的并行操作都使用固定的线程数,可以在程序开头全局配置,这样所有后续的collect()操作都会遵循这个设置:

// 先全局设置线程数,比如设置为4
polars::prelude::set_global_pool_threads(4)?;

let gaf_df = LazyCsvReader::new(file_path.clone())
    .with_has_header(false)
    .with_separator(b'\t')
    .finish()?;
let gaf_df_select = gaf_df
    .select([
        col("column_1").alias("read_id"),
        col("column_2").alias("length"),
        col("column_6").alias("path"),
        col("column_12").alias("mapq")
    ])
    .collect()?;

2. 针对单个LazyFrame操作单独设置

如果只是想给当前这一段LazyFrame的计算指定线程数,不影响其他操作,可以在collect()之前调用with_n_threads()方法:

let gaf_df = LazyCsvReader::new(file_path.clone())
    .with_has_header(false)
    .with_separator(b'\t')
    .finish()?;
let gaf_df_select = gaf_df
    .select([
        col("column_1").alias("read_id"),
        col("column_2").alias("length"),
        col("column_6").alias("path"),
        col("column_12").alias("mapq")
    ])
    .with_n_threads(4) // 只为这次collect操作指定4个线程
    .collect()?;

简单说一下原理:Lazy模式下,LazyCsvReader只是构建了读取和转换的逻辑计划,真正的IO和计算都在collect()阶段执行,这时候Polars会根据你设置的线程数来并行处理数据,提升效率。

备注:内容来源于stack exchange,提问作者zwh82

火山引擎 最新活动