Rust?duckdb和polars讀csv文件比較情況
duckdb在數(shù)據(jù)分析上,有非常多不錯的特質(zhì)。1、快;2、客戶體驗好,特別是可以同時批量讀csv(在一個目錄下的csv等文件)。polars的性能比pandas有非常多的超越。但背后的一些基于arrow的技術(shù)棧有很多相同之類。今天想比較一下兩者在csv數(shù)據(jù)讀寫的情況。
一、文件準(zhǔn)備
csv樣本內(nèi)容,是N行9列的csv標(biāo)準(zhǔn)格式,有字符串,有浮點數(shù),有整型。具體如下:
本次準(zhǔn)備了兩個csv文件,一個大約是2.1萬行、9列;一個是64萬行、9列;模式完全一樣。更大的類似百萬行或千萬行的數(shù)據(jù)目前暫不比較。這種數(shù)據(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花時: {:?} 秒!", 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 花時: {:?} 秒!", polars_csv_time.elapsed().as_secs_f32()); }
四、輸出
-----------"test.csv"-------------
duckdb取出的行數(shù):2048 列數(shù):9
duckdb 讀csv花時: 0.032244585 秒!
polars讀出csv的行和列數(shù):(21357, 9)
polars 讀csv 花時: 0.006511025 秒!
-----------"test.csv"-------------
-----------"test2.csv"-------------
duckdb取出的行數(shù):2048 列數(shù):9
duckdb 讀csv花時: 0.1279175 秒!
polars讀出csv的行和列數(shù):(640710, 9)
polars 讀csv 花時: 0.02369589 秒!
-----------"test2.csv"-------------
duckdb和polars讀文件共花:0.19441628秒!
結(jié)論:從上面的樣本來看,分別用duckdb和polars來讀csv兩個不同大小的文件,polars有優(yōu)勢。當(dāng)然,也可能是duckdb庫封裝的問題,也可能是文件大小不同,測試代表性還不全。謹(jǐn)供參考!
五、問題
從輸出可以明顯看出,duckdb庫讀出來的num_rows是有問題的。這個問題還待查實。從print_batches(&rbs).unwrap(),打印出來的內(nèi)容來看,并沒有少。
到此這篇關(guān)于Rust duckdb和polars讀csv文件比較的文章就介紹到這了,更多相關(guān)Rust讀csv文件比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust 數(shù)據(jù)分析利器polars用法詳解
這篇文章主要介紹了Rust 數(shù)據(jù)分析利器polars用法詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-08-08使用Rust采集天氣預(yù)報信息并實現(xiàn)實時更新數(shù)據(jù)功能
Rust作為一種高效、安全的編程語言,可以用于開發(fā)各種應(yīng)用,包括天氣預(yù)報采集系統(tǒng),本文將探討如何使用Rust來采集天氣預(yù)報信息,并實現(xiàn)實時更新數(shù)據(jù)的功能,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下2024-01-01