大海里的一场梦 發表於 2024-6-27 09:59:00

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、文件准备</li><li>二、toml文件</li><li>三、main.rs</li><li>四、输出</li><li>五、问题</li></ul></div><p>duckdb在数据分析上,有非常多不错的特质。1、快;2、客户体验好,特别是可以同时批量读csv(在一个目录下的csv等文件)。polars的性能比pandas有非常多的超越。但背后的一些基于arrow的技术栈有很多相同之类。今天想比较一下两者在csv数据读写的情况。</p>
<p class="maodian"></p><h2>一、文件准备</h2>
<p>csv样本内容,是N行9列的csv标准格式,有字符串,有浮点数,有整型。具体如下:</p>
<p style="text-align:center"><img alt="在这里插入图片描述" src="https://img.jbzj.com/file_images/article/202406/202406270954086.png" /></p>
<p>本次准备了两个csv文件,一个大约是2.1万行、9列;一个是64万行、9列;模式完全一样。更大的类似百万行或千万行的数据目前暂不比较。这种数据量级较少。</p>
<p class="maodian"></p><h2>二、toml文件</h2>
<div class="jb51code"><pre class="brush:plain;">
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

duckdb = { version = "0.10.2", features = ["bundled"] }
polars = {version ="0.39.0"}</pre></div>
<p class="maodian"></p><h2>三、main.rs</h2>
<div class="jb51code"><pre class="brush:plain;">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:&amp;str) -&gt;Result&lt;()&gt; {
    let duckdb_csv_time = Instant::now();
    let db = Connection::open_in_memory()?;
    let sql_format = format!("SELECT * from read_csv('{}');",filepath);
    let rbs: Vec&lt;RecordBatch&gt; = db
      .prepare(&amp;sql_format)?
      .query_arrow([])?
      .collect();
    // 批量打印
    //print_batches(&amp;rbs).unwrap();
    assert!(rbs.len()&gt;0);
    println!("duckdb取出的行数:{:?} 列数:{:?}",rbs.num_rows(),rbs.num_columns());
    println!("duckdb 读csv花时: {:?} 秒!", duckdb_csv_time.elapsed().as_secs_f32());
    let _ = db.close();
    Ok(())
}
fn polars_read_csv(filepath:&amp;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());
}</pre></div>
<p class="maodian"></p><h2>四、输出</h2>
<blockquote><p>-----------&quot;test.csv&quot;-------------<br />duckdb取出的行数:2048 列数:9<br />duckdb 读csv花时: 0.032244585 秒!<br />polars读出csv的行和列数:(21357, 9)<br />polars 读csv 花时: 0.006511025 秒!<br />-----------&quot;test.csv&quot;-------------<br />-----------&quot;test2.csv&quot;-------------<br />duckdb取出的行数:2048 列数:9<br />duckdb 读csv花时: 0.1279175 秒!<br />polars读出csv的行和列数:(640710, 9)<br />polars 读csv 花时: 0.02369589 秒!<br />-----------&quot;test2.csv&quot;-------------<br />duckdb和polars读文件共花:0.19441628秒!</p></blockquote>
<p>结论:从上面的样本来看,分别用duckdb和polars来读csv两个不同大小的文件,polars有优势。当然,也可能是duckdb库封装的问题,也可能是文件大小不同,测试代表性还不全。谨供参考!</p>
<p class="maodian"></p><h2>五、问题</h2>
<p>从输出可以明显看出,duckdb库读出来的num_rows是有问题的。这个问题还待查实。从print_batches(&amp;rbs).unwrap(),打印出来的内容来看,并没有少。</p>
<p>到此这篇关于Rust duckdb和polars读csv文件比较的文章就介绍到这了,更多相关Rust读csv文件比较内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Rust&nbsp;数据分析利器polars用法详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Rust duckdb和polars读csv文件比较情况