当前位置: 首页> 汽车> 时评 > Rust: duckdb和polars读csv文件比较

Rust: duckdb和polars读csv文件比较

时间:2025/7/11 22:49:29来源:https://blog.csdn.net/wowotuo/article/details/139987522 浏览次数: 0次

duckdb在数据分析上,有非常多不错的特质。1、快;2、客户体验好,特别是可以同时批量读csv(在一个目录下的csv等文件)。polars的性能比pandas有非常多的超越。但背后的一些基于arrow的技术栈有很多相同之类。今天想比较一下两者在csv数据读写的情况。

一、文件准备
csv样本内容,是N行9列的csv标准格式,有字符串,有浮点数,有整型。具体如下:
在这里插入图片描述本次准备了两个csv文件,一个大约是2.1万行、9列;一个是64万行、9列;模式完全一样。更大的类似百万行或千万行的数据目前暂不比较。这种数据量级较少。

二、toml文件

[package]
name = "my_duckdb"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
duckdb = { version = "0.10.2", features = ["bundled"] }
polars = {version ="0.39.0"}

三、main.rs

use duckdb::{arrow::{record_batch::RecordBatch, util::pretty::print_batches},Connection, Result,
};
use polars::prelude::*;
use std::time::Instant;
fn main() {let time0 = Instant::now();//test.csv:2w行;test2.csv:64w行let csvs = ["test.csv","test2.csv"]; for csv in csvs{println!("-----------{:?}-------------",csv);duckdb_read_csv(csv).unwrap();polars_read_csv(csv);println!("-----------{:?}-------------",csv);}println!("duckdb和polars读文件共花:{:?}秒!",time0.elapsed().as_secs_f32());}
fn duckdb_read_csv(filepath:&str) ->Result<()> {let duckdb_csv_time = Instant::now();let db = Connection::open_in_memory()?;let sql_format = format!("SELECT * from read_csv('{}');",filepath);let rbs: Vec<RecordBatch> = db.prepare(&sql_format)?.query_arrow([])?.collect();// 批量打印//print_batches(&rbs).unwrap();assert!(rbs.len()>0);println!("duckdb取出的行数:{:?} 列数:{:?}",rbs[0].num_rows(),rbs[0].num_columns());println!("duckdb 读csv花时: {:?} 秒!", duckdb_csv_time.elapsed().as_secs_f32());let _ = db.close();Ok(())
}fn polars_read_csv(filepath:&str){let polars_csv_time  = Instant::now();let df = CsvReader::from_path(filepath).unwrap().has_header(true).finish().unwrap();println!("polars读出csv的行和列数:{:?}",df.shape());println!("polars 读csv 花时: {:?} 秒!", polars_csv_time.elapsed().as_secs_f32());
}

四、输出

-----------"test.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.032244585 秒!
polars读出csv的行和列数:(21357, 9)
polars 读csv 花时: 0.006511025 秒!
-----------"test.csv"-------------
-----------"test2.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.1279175 秒!
polars读出csv的行和列数:(640710, 9)
polars 读csv 花时: 0.02369589 秒!
-----------"test2.csv"-------------
duckdb和polars读文件共花:0.19441628秒!

结论:从上面的样本来看,分别用duckdb和polars来读csv两个不同大小的文件,polars有优势。当然,也可能是duckdb库封装的问题,也可能是文件大小不同,测试代表性还不全。谨供参考!

五、问题
从输出可以明显看出,duckdb库读出来的num_rows是有问题的。这个问题还待查实。从print_batches(&rbs).unwrap(),打印出来的内容来看,并没有少。

关键字:Rust: duckdb和polars读csv文件比较

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: