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 函数式编程的具体使用

    本文主要介绍了Rust 函数式编程的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-06-06
  • Rust中的关联类型总结

    Rust中的关联类型总结

    关联类型是定义通用trait的一种机制。它允许在trait中定义一个或多个占位符类型,这些类型将在trait的实现中具体化。文中有详细示例代码供参考,需要的朋友可以阅读一下
    2023-05-05
  • Tauri 打开本地文件踩坑分析解决

    Tauri 打开本地文件踩坑分析解决

    这篇文章主要为大家介绍了Tauri 打开本地文件踩坑分析解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Rust获取命令行参数及IO操作方法

    Rust获取命令行参数及IO操作方法

    Rust作为一门系统编程语言,提供了强大且安全的I/O操作支持,本文给大家介绍Rust获取命令行参数以及IO操作,感兴趣的朋友一起看看吧
    2025-06-06
  • Rust cargo 命令行工具使用示例教程

    Rust cargo 命令行工具使用示例教程

    cargo 是 Rust 的构建系统和包管理器,负责创建项目、编译代码、管理依赖、运行测试等,是日常开发中最常用的工具,这篇文章主要介绍了Rust cargo 命令行工具使用教程,需要的朋友可以参考下
    2025-04-04
  • Rust中类型转换在错误处理中的应用小结

    Rust中类型转换在错误处理中的应用小结

    随着项目的进展,关于Rust的故事又翻开了新的一页,今天来到了服务器端的开发场景,发现错误处理中的错误类型转换有必要分享一下,对Rust错误处理相关知识感兴趣的朋友一起看看吧
    2023-09-09
  • 深入了解Rust中trait的使用

    深入了解Rust中trait的使用

    先前我们提到过 trait,那么Rust中的trait 是啥呢?本文将通过一些示例为大家详细讲讲Rust中trait的使用,感兴趣的小伙伴可以了解一下
    2022-11-11
  • Rust处理错误的实现方法

    Rust处理错误的实现方法

    程序在运行的过程中,总是会不可避免地产生错误,而如何优雅地解决错误,也是语言的设计哲学之一。本文就来和大家来了Rust是如何处理错误的,感兴趣的可以了解一下
    2023-03-03
  • 深入了解Rust 结构体的使用

    深入了解Rust 结构体的使用

    结构体是一种自定义的数据类型,它允许我们将多个不同的类型组合成一个整体。下面我们就来学习如何定义和使用结构体,并对比元组与结构体之间的异同,需要的可以参考一下
    2022-11-11
  • Rust语言之结构体和枚举的用途与高级功能详解

    Rust语言之结构体和枚举的用途与高级功能详解

    Rust 是一门注重安全性和性能的现代编程语言,其中结构体和枚举是其强大的数据类型之一,了解结构体和枚举的概念及其高级功能,将使你能够更加灵活和高效地处理数据,本文将深入探讨 Rust 中的结构体和枚举,并介绍它们的用途和高级功能
    2023-10-10

最新评论