Rust duckdb和polars读csv文件比较情况

 更新时间:2024年06月27日 09:59:00   作者:songroom  
duckdb在数据分析上,有非常多不错的特质,1、快;2、客户体验好,特别是可以同时批量读csv在一个目录下的csv等文件,今天来比较下Rust duckdb和polars读csv文件比较的情况,感兴趣的朋友一起看看吧

duckdb在数据分析上,有非常多不错的特质。1、快;2、客户体验好,特别是可以同时批量读csv(在一个目录下的csv等文件)。polars的性能比pandas有非常多的超越。但背后的一些基于arrow的技术栈有很多相同之类。今天想比较一下两者在csv数据读写的情况。

一、文件准备

csv样本内容,是N行9列的csv标准格式,有字符串,有浮点数,有整型。具体如下:

在这里插入图片描述

本次准备了两个csv文件,一个大约是2.1万行、9列;一个是64万行、9列;模式完全一样。更大的类似百万行或千万行的数据目前暂不比较。这种数据量级较少。

二、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取出的行数:{:?} 列数:{:?}",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的行和列数:{:?}",df.shape());
    println!("polars 读csv 花时: {:?} 秒!", polars_csv_time.elapsed().as_secs_f32());
}

四、输出

-----------"test.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.032244585 秒!
polars读出csv的行和列数:(21357, 9)
polars 读csv 花时: 0.006511025 秒!
-----------"test.csv"-------------
-----------"test2.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.1279175 秒!
polars读出csv的行和列数:(640710, 9)
polars 读csv 花时: 0.02369589 秒!
-----------"test2.csv"-------------
duckdb和polars读文件共花:0.19441628秒!

结论:从上面的样本来看,分别用duckdb和polars来读csv两个不同大小的文件,polars有优势。当然,也可能是duckdb库封装的问题,也可能是文件大小不同,测试代表性还不全。谨供参考!

五、问题

从输出可以明显看出,duckdb库读出来的num_rows是有问题的。这个问题还待查实。从print_batches(&rbs).unwrap(),打印出来的内容来看,并没有少。

到此这篇关于Rust duckdb和polars读csv文件比较的文章就介绍到这了,更多相关Rust读csv文件比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • 详解Rust中的方法

    详解Rust中的方法

    方法其实就是结构体的成员函数,在C语言中的结构体是没有成员函数的,但是Rust毕竟也是一门面向对象的编程语言,所以给结构体加上方法的特性很符合面向对象的特点,这篇文章主要介绍了Rust中的方法,需要的朋友可以参考下
    2022-10-10
  • 解析Rust struct 中的生命周期

    解析Rust struct 中的生命周期

    rust 的生命周期保证了内存的安全性,同时也增加了开发者的心智负担。是在上线之前多费心思写代码,还是在上线以后忙忙活活查问题,这是个 trade off 问题,这篇文章主要介绍了Rust struct 中的生命周期,需要的朋友可以参考下
    2022-10-10
  • 深入了解Rust的生命周期

    深入了解Rust的生命周期

    生命周期指的是引用保持有效的作用域,Rust的每个引用都有自己的生命周期。本文将通过示例和大家详细说说Rust的生命周期,需要的可以参考一下
    2022-12-12
  • rust 包模块组织结构详解

    rust 包模块组织结构详解

    RUST提供了一系列的功能来帮助我们管理代码,包括决定哪些细节是暴露的、哪些细节是私有的,以及不同的作用域的命名管理,这篇文章主要介绍了rust 包模块组织结构的相关知识,需要的朋友可以参考下
    2023-12-12
  • Rust anyhow 简明示例教程

    Rust anyhow 简明示例教程

    anyhow 是 Rust 中的一个库,旨在提供灵活的、具体的错误处理能力,建立在 std::error::Error 基础上,主要用于那些需要简单错误处理的应用程序和原型开发中,本文给大家分享Rust anyhow 简明教程,一起看看吧
    2024-06-06
  • 聊聊Rust 运算符

    聊聊Rust 运算符

    运算符 用于对数据执行一些操作。被运算符执行操作的数据我们称之为操作数。下面通过本文给大家介绍Rust 运算符的相关知识,感兴趣的朋友一起看看吧
    2021-11-11
  • RUST语言函数的定义与调用方法

    RUST语言函数的定义与调用方法

    定义一个RUST函数使用fn关键字,下面通过本文给大家介绍RUST语言函数的定义与调用方法,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • rust实现post小程序(完整代码)

    rust实现post小程序(完整代码)

    这篇文章主要介绍了rust实现一个post小程序,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • rust智能指针的具体使用

    rust智能指针的具体使用

    智能指针是一些数据结构,它们的行为类似于指针但拥有额外的元数据和附加功能,本文就来介绍一下rust智能指针的具体使用,感兴趣的可以了解一下
    2023-12-12
  • Rust开发WebAssembly在Html和Vue中的应用小结(推荐)

    Rust开发WebAssembly在Html和Vue中的应用小结(推荐)

    这篇文章主要介绍了Rust开发WebAssembly在Html和Vue中的应用,本文将带领大家在普通html上和vue手脚架上都来运行wasm的流程,需要的朋友可以参考下
    2022-08-08

最新评论