当前位置: 首页 > news >正文

测试DuckDB插件对不同格式xlsx文件的读写效率

我们知道,xlsx是符合OOXML规范的格式,但其实这种格式对其组成部分的容忍度很高。
同一个表格,以不带标题行的3行*3列整数和浮点数据为例。

2659	0.116233238	0.802683908
2734	0.884122563	0.932195575
2745	0.458549115	0.30044512

在duckdb输出的xlsx中的sheet1.xml, 其sheetData标签包裹的部分如下:
如下

<sheetData>
<row r="1">
<c r="A1">
<v>2659</v>
</c>
<c r="B1">
<v>0.1162332380673584</v>
</c>
<c r="C1">
<v>0.8026839081352738</v>
</c>
</row>
<row r="2">
<c r="A2">
<v>2734</v>
</c>
<c r="B2">
<v>0.8841225634634741</v>
</c>
<c r="C2">
<v>0.9321955751461917</v>
</c>
</row>
<row r="3">
<c r="A3">
<v>2745</v>
</c>
<c r="B3">
<v>0.45854911529715814</v>
</c>
<c r="C3">
<v>0.30044511989122274</v>
</c>
</row>
</sheetData>

同一个文件,用wps打开后,再保存为xlsx, 同样的部分变成了

<sheetData>
<row r="1" spans="1:3">
<c r="A1">
<v>2659</v>
</c>
<c r="B1">
<v>0.116233238067358</v>
</c>
<c r="C1">
<v>0.802683908135274</v>
</c>
</row>
<row r="2" spans="1:3">
<c r="A2">
<v>2734</v>
</c>
<c r="B2">
<v>0.884122563463474</v>
</c>
<c r="C2">
<v>0.932195575146192</v>
</c>
</row>
<row r="3" spans="1:3">
<c r="A3">
<v>2745</v>
</c>
<c r="B3">
<v>0.458549115297158</v>
</c>
<c r="C3">
<v>0.300445119891223</v>
</c>
</row>
</sheetData>

比较发现,它给每个row标签增加了spans=“1:3”, duckdb原来生成的文件也能被wps打开,说明这个新增的部分不是必需的。不仅于此,像row和c标签中表示行号列号的r属性,其实也能省略,手工将sheet1.xml这些属性删除,再把它放回xlsx中,文件依然能正常打开,内容完全一致。

<sheetData>
<row>
<c>
<v>2659</v>
</c>
<c>
<v>0.1162332380673584</v>
</c>
<c>
<v>0.8026839081352738</v>
</c>
</row>
<row>
<c>
<v>2734</v>
</c>
<c>
<v>0.8841225634634741</v>
</c>
<c>
<v>0.9321955751461917</v>
</c>
</row>
<row>
<c>
<v>2745</v>
</c>
<c>
<v>0.45854911529715814</v>
</c>
<c>
<v>0.30044511989122274</v>
</c>
</row>
</sheetData>

在文本编辑器,分别选择以上部分,得到大小分别为453、481、372字节,简单数学计算可得,当数据规模扩大时,这个比例大体不变,而部分占整个xml文件的比例会越来越大,因此最终xml文件的大小也差不多这个比例。
下面就实际测试一下4万行256列的随机数据,读取不同标签格式xlsx的用时。

create table t as select i//256 r, i%256 c, random() v from range(10240000)t(i);create table t40000_256 as pivot t on substr((1000+c)::varchar, -3) using sum(v);copy t40000_256 to 'duck40000_256.xlsx' with(header 0);create table duck2 as from 'duck40000_256.xlsx';
Run Time (s): real 5.172 user 4.703125 sys 0.421875
D from duck2 limit 2;
┌────────┬────────────────────┬────────────────────┬───┬─────────────────────┬────────────────────┬────────────────────┐
│   A1   │         B1         │         C1         │ … │         JU1         │        JV1         │        JW1         │
│ double │       double       │       double       │   │       double        │       double       │       double       │
├────────┼────────────────────┼────────────────────┼───┼─────────────────────┼────────────────────┼────────────────────┤
│ 2659.00.11623323806735840.8026839081352738 │ … │    0.355418603349270.65443219295228370.4958646194732272 │
│ 2734.00.88412256346347410.9321955751461917 │ … │ 0.259847207342243870.80552948193144340.1164436018095856 │
├────────┴────────────────────┴────────────────────┴───┴─────────────────────┴────────────────────┴────────────────────┤
│ 2 rows                                                                                         257 columns (6 shown) │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.073 user 0.062500 sys 0.000000

再将它用wps保存一次,保存前后的大小

2025/08/20  21:49       130,892,489 duck40000_256.xlsx2025/08/20  22:01       138,414,845 wps40000_256.xlsxD create table t3 as from 'wps40000_256.xlsx';Run Time (s): real 4.136 user 4.062500 sys 0.062500

不可思议,居然多了spans=标签,文件大的wps格式xlsx读取更快,还快了20%。这是excel插件的个例,还是各种读取插件的共性?

再用rusty_sheet插件测试

D load rusty_sheet;D create table duck3 as from read_sheet('duck40000_256.xlsx',header=0);
Run Time (s): real 8.584 user 8.250000 sys 0.312500D create table wps3 as from read_sheet('wps40000_256.xlsx',header=0);
Run Time (s): real 8.531 user 8.140625 sys 0.375000

这次两种格式的差距可以忽略不计。
再用spatial插件测试

load spatial;
D create table wps4 as from st_read('wps40000_256.xlsx');
Run Time (s): real 10.561 user 10.359375 sys 0.203125D create table duck4 as from st_read('duck40000_256.xlsx');
Run Time (s): real 10.746 user 10.828125 sys 0.078125

差距同样可以忽略不计。
再用sheetreader插件测试

load sheetreader;
D create table wps5 as from sheetreader('wps40000_256.xlsx');
Run Time (s): real 1.964 user 4.921875 sys 0.390625
D from wps5 limit 2;
┌──────────┬───────────────────┬───────────────────┬───┬───────────────────┬───────────────────┬───────────────────┐
│ Numeric0 │     Numeric1      │     Numeric2      │ … │    Numeric254     │    Numeric255     │    Numeric256     │
│  doubledoubledouble       │   │      doubledoubledouble       │
├──────────┼───────────────────┼───────────────────┼───┼───────────────────┼───────────────────┼───────────────────┤
│   2659.00.1162332380673580.802683908135274 │ … │  0.355418603349270.6544321929522840.495864619473227 │
│   2734.00.8841225634634740.932195575146192 │ … │ 0.2598472073422440.8055294819314430.116443601809586 │
├──────────┴───────────────────┴───────────────────┴───┴───────────────────┴───────────────────┴───────────────────┤
│ 2 rows                                                                                     257 columns (6 shown) │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
D create table duck5 as from sheetreader('duck40000_256.xlsx');
Run Time (s): real 1.679 user 8.046875 sys 0.093750
Invalid Error:
Failed to retrieve shared strings file

奇怪,同样没有sharedstring.xml,wps格式就能读取,而duckdb格式报错,因为duckdb格式xlsx读取失败,没法比较两种格式的读取速度差异。
明天再测一下没有其他标签的速度。

http://www.lryc.cn/news/626919.html

相关文章:

  • 基于Pytochvideo训练自己的的视频分类模型
  • 【C++】基础:C++11-14-17常用新特性介绍
  • XR(AR/VR/MR)芯片方案,Soc VS “MCU+协处理器”?
  • 109、【OS】【Nuttx】【周边】效果呈现方案解析:workspaceStorage(下)
  • 【最后203篇系列】034 使用SQLite构建简单的任务管理
  • 解决Docker 无法连接到官方镜像仓库
  • LINUX 820 shell:shift,expect
  • 49 C++ STL模板库18-类模板-pair
  • 双模式 RTMP H.265 播放器解析:从国内扩展到 Enhanced RTMP 标准的演进
  • 深入理解JVM内存结构:从字节码执行到垃圾回收的全景解析
  • 基于单片机智能加湿器/空气加湿器
  • ubuntu系统上的conda虚拟环境导出方便下次安装
  • 计算机毕设Spark项目实战:基于大数据技术的就业数据分析系统Django+Vue开发指南
  • Typescript入门-数组元组讲解
  • CSS3DRenderer+ CSS3DObject实现在 Three.js 中添加文本内容
  • 监听视频是否加载完毕
  • 次短路P2865 [USACO06NOV] Roadblocks G题解
  • KubeBlocks for ClickHouse 容器化之路
  • 【机器学习深度学习】AI大模型高并发挑战:用户负载部署策略
  • OceanBase DBA实战营2期--SQL 关键字限流学习笔记
  • Angular由一个bug说起之十八:伴随框架升级而升级ESLint遇到的问题与思考
  • 文本智能抽取:如何用NLP从海量文本中“炼“出真金?-告别无效阅读,让AI成为你的“信息炼金师
  • springboot--用户访问系统的增删改查记录
  • 静/动态库 IIC(arm) day58
  • Docker在Linux中安装与使用教程
  • 【Android】Serializable和Parcelable序列化对象:传递自定义类数据
  • 无人机抗噪模块技术概述!
  • AI + 金融领域 + 落地典型案例
  • AI +金融 = 七大核心维度+ 落地典型困难
  • 基于深度学习CenterPoint的3D目标检测部署实战