Rust语言中duckdb和polars库读取CSV文件性能对比
创作时间:
作者:
@小白创作中心
Rust语言中duckdb和polars库读取CSV文件性能对比
引用
CSDN
1.
https://blog.csdn.net/wowotuo/article/details/139987522
在数据分析领域,Rust语言的两个重要库duckdb和polars在处理CSV文件时表现如何?本文通过实际代码和性能测试,对比了这两个库在读取不同大小CSV文件时的效率,帮助开发者选择更适合的工具。
一、实验准备
CSV文件准备
本次实验使用了两个CSV文件,结构相同,均为9列,但行数不同:
test.csv:约2.1万行test2.csv:约64万行
CSV文件的具体内容如下:
依赖配置
实验环境基于Rust,使用Cargo管理依赖。具体依赖配置如下:
[package]
name = "my_duckdb"
version = "0.1.0"
edition = "2021"
[dependencies]
duckdb = { version = "0.10.2", features = ["bundled"] }
polars = { version = "0.26.1", features = ["lazy"] }
二、代码实现
主程序(main.rs)
实验中使用了duckdb和polars两种库来读取CSV文件。polars库提供了两种模式:lazy(延迟)和eager(即时)。通常情况下,lazy模式效率更高。
use duckdb::{
arrow::{record_batch::RecordBatch, util::pretty::print_batches},
Connection, Result,
};
use polars::prelude::*;
use std::time::Instant;
use std::fs::File;
fn main() {
let time0 = Instant::now();
let csvs = ["test.csv", "test2.csv"];
for csv in csvs {
println!("-----------{:?}-------------", csv);
duckdb_read_csv(csv).unwrap();
polars_eager_read_csv(csv);
polars_lazy_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();
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_eager_read_csv(filepath: &str) {
let polars_eager_csv_time = Instant::now();
let df = CsvReader::from_path(filepath)
.unwrap()
.has_header(true)
.finish()
.unwrap();
println!("polars eager 读出csv的行和列数:{:?}", df.shape());
println!("polars eager 读csv 花时: {:?} 秒!", polars_eager_csv_time.elapsed().as_secs_f32());
}
fn polars_lazy_read_csv(filepath: &str) {
let polars_lazy_csv_time = Instant::now();
let p = LazyCsvReader::new(filepath)
.has_header(true)
.finish()
.unwrap();
let mut df = p.collect().expect("error to dataframe!");
println!("polars lazy 读出csv的行和列数:{:?}", df.shape());
println!("polars lazy 读csv 花时: {:?} 秒!", polars_lazy_csv_time.elapsed().as_secs_f32());
polars_write_csv(&mut df, &format!("polars_{}", filepath));
}
fn polars_write_csv(df: &mut DataFrame, pathfile: &str) {
let polars_write_csv_time = Instant::now();
let mut file = File::create(pathfile).expect("could not create file");
CsvWriter::new(&mut file)
.has_header(true)
.with_delimiter(b' ')
.finish(df)
.expect("error!");
println!("polars write csv 花时: {:?} 秒!", polars_write_csv_time.elapsed().as_secs_f32());
}
三、实验结果
运行上述代码后,得到以下输出结果:
-----------"test.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.03224426 秒!
polars eager 读出csv的行和列数:(21357, 9)
polars eager 读csv 花时: 0.007638709 秒!
polars lazy 读出csv的行和列数:(21357, 9)
polars lazy 读csv 花时: 0.002562615 秒!
polars write csv 花时: 0.004541633 秒!
-----------"test.csv"-------------
-----------"test2.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.14970613 秒!
polars eager 读出csv的行和列数:(640710, 9)
polars eager 读csv 花时: 0.026194088 秒!
polars lazy 读出csv的行和列数:(640710, 9)
polars lazy 读csv 花时: 0.020053046 秒!
polars write csv 花时: 0.06960724 秒!
-----------"test2.csv"-------------
duckdb和polars读文件共花:0.31616783秒!
四、结论
- 从实验结果来看,在读取CSV文件时,polars库的表现优于duckdb库。
- polars库的lazy模式在读取效率上优于eager模式。
- polars库在写入CSV文件时也表现出不错的效率。
五、问题与建议
在实验过程中发现,duckdb库读取CSV文件时返回的行数存在异常(显示为2048行,实际应为数万行)。这个问题可能与库的封装有关,建议进一步查实。此外,测试样本量相对较小,建议在更大规模的数据集上进行测试以获得更全面的结论。
热门推荐
保底收益保障机制:投资中的稳定基石
生肖猴的性格与特点
铁路调图!广州南站东站增直达站点,过港列车再“解锁”新城市
容易饿是什么原因
茅台酒有木盒装的吗
白粥喝腻了?5种粗粮“黄金CP”吃出早餐仪式感,营养控糖两手抓
上有收益、下有保底,关于“可转债”,你了解多少?
韩国台湾人均GDP陆续首次超过日本 东亚经济格局变化显著
文献管理工具Zotero7的安装与配置
电动汽车充电桩安装流程详解
不知如何跟孩子谈“生死”?这些电影可以帮到你
反复烧开的水不能喝?医生:这3类水,喝了心脏负担直线加重
用万用表怎样辨别零线火线地线
中元节几时祭祖?不早不晚,有讲究,老祖宗定下的规矩
瓜迪奥拉谈曼城伤病、对手及未来规划
新疆天山天池旅游攻略:详细路线及实用建议
高压电机的维护技巧与常见问题(高压电机维护和保养标准)
李白写自由的诗句赏析
这些重大基础设施,让“一带一路”更加联通
天下为公——什么是孙中山真正的遗产?
头痛很常见!但这4种情况千万别硬抗
核桃的正确吃法:健康养生从细节开始
探索甘蔗渣:甘蔗纤维的可持续解决方案
胆囊切除后有什么危害
银行的网上银行登录密码忘记怎么办?
慢性咳嗽是什么毛病?得了慢性咳嗽该怎么办?
红糖真的可以解酒吗?从科学角度解析糖与酒精代谢的关系
中药材葛根:从产地到功效的全面解析
茅台酒包装盒特点及啤酒相关知识
公司倒闭后车辆过户给个人的详细流程及注意事项