Rust?duckdb和polars讀csv文件比較情況
duckdb在數(shù)據(jù)分析上,有非常多不錯(cuò)的特質(zhì)。1、快;2、客戶體驗(yàn)好,特別是可以同時(shí)批量讀csv(在一個(gè)目錄下的csv等文件)。polars的性能比pandas有非常多的超越。但背后的一些基于arrow的技術(shù)棧有很多相同之類。今天想比較一下兩者在csv數(shù)據(jù)讀寫的情況。
一、文件準(zhǔn)備
csv樣本內(nèi)容,是N行9列的csv標(biāo)準(zhǔn)格式,有字符串,有浮點(diǎn)數(shù),有整型。具體如下:

本次準(zhǔn)備了兩個(gè)csv文件,一個(gè)大約是2.1萬(wàn)行、9列;一個(gè)是64萬(wàn)行、9列;模式完全一樣。更大的類似百萬(wàn)行或千萬(wàn)行的數(shù)據(jù)目前暫不比較。這種數(shù)據(jù)量級(jí)較少。
二、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取出的行數(shù):{:?} 列數(shù):{:?}",rbs[0].num_rows(),rbs[0].num_columns());
println!("duckdb 讀csv花時(shí): {:?} 秒!", 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的行和列數(shù):{:?}",df.shape());
println!("polars 讀csv 花時(shí): {:?} 秒!", polars_csv_time.elapsed().as_secs_f32());
}四、輸出
-----------"test.csv"-------------
duckdb取出的行數(shù):2048 列數(shù):9
duckdb 讀csv花時(shí): 0.032244585 秒!
polars讀出csv的行和列數(shù):(21357, 9)
polars 讀csv 花時(shí): 0.006511025 秒!
-----------"test.csv"-------------
-----------"test2.csv"-------------
duckdb取出的行數(shù):2048 列數(shù):9
duckdb 讀csv花時(shí): 0.1279175 秒!
polars讀出csv的行和列數(shù):(640710, 9)
polars 讀csv 花時(shí): 0.02369589 秒!
-----------"test2.csv"-------------
duckdb和polars讀文件共花:0.19441628秒!
結(jié)論:從上面的樣本來(lái)看,分別用duckdb和polars來(lái)讀csv兩個(gè)不同大小的文件,polars有優(yōu)勢(shì)。當(dāng)然,也可能是duckdb庫(kù)封裝的問(wèn)題,也可能是文件大小不同,測(cè)試代表性還不全。謹(jǐn)供參考!
五、問(wèn)題
從輸出可以明顯看出,duckdb庫(kù)讀出來(lái)的num_rows是有問(wèn)題的。這個(gè)問(wèn)題還待查實(shí)。從print_batches(&rbs).unwrap(),打印出來(lái)的內(nèi)容來(lái)看,并沒(méi)有少。
到此這篇關(guān)于Rust duckdb和polars讀csv文件比較的文章就介紹到這了,更多相關(guān)Rust讀csv文件比較內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust中類型轉(zhuǎn)換在錯(cuò)誤處理中的應(yīng)用小結(jié)
隨著項(xiàng)目的進(jìn)展,關(guān)于Rust的故事又翻開了新的一頁(yè),今天來(lái)到了服務(wù)器端的開發(fā)場(chǎng)景,發(fā)現(xiàn)錯(cuò)誤處理中的錯(cuò)誤類型轉(zhuǎn)換有必要分享一下,對(duì)Rust錯(cuò)誤處理相關(guān)知識(shí)感興趣的朋友一起看看吧2023-09-09
Rust語(yǔ)言之結(jié)構(gòu)體和枚舉的用途與高級(jí)功能詳解
Rust 是一門注重安全性和性能的現(xiàn)代編程語(yǔ)言,其中結(jié)構(gòu)體和枚舉是其強(qiáng)大的數(shù)據(jù)類型之一,了解結(jié)構(gòu)體和枚舉的概念及其高級(jí)功能,將使你能夠更加靈活和高效地處理數(shù)據(jù),本文將深入探討 Rust 中的結(jié)構(gòu)體和枚舉,并介紹它們的用途和高級(jí)功能2023-10-10

