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行,实际应为数万行)。这个问题可能与库的封装有关,建议进一步查实。此外,测试样本量相对较小,建议在更大规模的数据集上进行测试以获得更全面的结论。
热门推荐
中国月饼出口韩国被拒收:脱氢乙酸钠引发的警示
轮胎再生胶硫化配方设计要点
从死亡证明到遗产分配:详解中国遗产继承流程
原神纳西妲:草元素机制详解与实战攻略
从417本经验书到699万摩拉:纳西妲培养成本详解
命运方舟新版本更新:7种途径获取航海冒险物
氯诺昔康临床应用指南:适应症、用法用量与禁忌人群
镇痛抗炎药氯诺昔康:从功效到不良反应的全方位解读
区块链赋能金融创新:四大领域应用实践与挑战
新年首周比特币涨超10万,多家机构密集增持
安万现象:传统戏曲的复兴之光与文化启示
秦声入骨说安万
普贤菩萨石雕:寺庙艺术的瑰宝
峨眉山普贤殿:一座融合建筑艺术与佛教文化的千年古刹
峨眉山普贤菩萨文化节盛大开幕,弘扬大行精神
河南三门峡首创生态警务室,1.6万天鹅安心越冬
冬日天鹅湖:三门峡迎来万只天鹅,附最佳观赏攻略
三门峡打造“天鹅之城”:1.6万只大天鹅越冬,带动冬季旅游
李乃文:用公益传递正能量
生活压力大易上火?中医教你这样滋阴降火
从"牙刷"到实力派:李乃文与《恋爱的犀牛》
李乃文新作《势在必行》来袭!国内首部狱侦剧能否引爆2025年悬疑剧市场?
李乃文新作《清明上河图密码》:一个亦庄亦谐的发明家
2025春节ETC免费通行:8天时段,这些细节要记牢
2025元旦ETC免费通行:7座以下车辆享3天优惠
ETC用户破2亿,智慧交通迎来车路协同新阶段
车顶行李架加装指南:尺寸限制300mm,安装后需备案
尺寸有要求,安装有讲究:新交规下的车顶行李箱使用指南
一文掌握:威兰达车顶行李箱选购与安装指南
车顶行李箱使用指南:选购、安装与安全规范