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行,实际应为数万行)。这个问题可能与库的封装有关,建议进一步查实。此外,测试样本量相对较小,建议在更大规模的数据集上进行测试以获得更全面的结论。
热门推荐
狗粮成分多样,选天然成分为主
什麼是益生菌?益生菌怎麼吃?6大益生菌功效帶你全面了解!
2024年心理学院校报录比汇总:最高达30:1!
从抗炎到长寿:5种食物让老年人远离慢性发炎!研究揭开它们的抗炎密码
长安大学就业最好专业是什么(学校就业率怎么样)
白萝卜吃得辣是过敏反应吗
180度激光避障传感器技术详解(从原理到应用,全面解读现代避障技术的核心组件)
2025艺术史论专业就业前景及方向:好找工作吗?
星月菩提寓意象征与配戴祈愿
蛲虫病比较好的治疗方法
不同车型的雨刷器安装拆卸方式及常见问题解析
胰腺解剖与病理生理
为何明英宗非要杀护国功臣于谦?
黄酒保质期与开瓶存放时长,看完这篇就懂了
达尔文奖:荣誉还是讽刺?
一个人死亡时知道自己正在死亡吗?心理学家的答案让人难以接受
财神上香的正确方法
"左灯右行"是什么意思?这个网络流行语背后的文化解读
现代场效应晶体管(FET)的发明先驱
Windows 7系统硬件配置要求详解
2024山东理工大学研究生复试内容
太方便了,坐高铁也能点外卖
几月种姜最合适?
普渡大学制成锑纳米链电极 可增加电池容量并缩短充电时间
制作披萨用什么面粉?高筋还是低筋?
朱棣是明朝第3位皇帝,为何被称为明成祖?其中原因不简单
新航季首都机场航班量略有增加,国航部分国内航班航站楼有调整
斑马鱼:生命科学研究中的重要模式生物
探究翡翠牛血红色调:牛血红翡翠是暗红色还是鲜红色?
深圳皇岗村旧改进展,楼市重构加速