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

各种读取csv文件的工具性能比较

在翻阅calamine作者的quick-csv存储库时无意中看到有个10年前的csv读取比赛, 把比赛选手源程序下载下来测试看到底有多快。

git clone https://bitbucket.org/ewanhiggs/csv-game.git

这些源程序只有比赛程序本身,依赖的文件有的在主页,有的在makefile中写出。冠军是一个叫csvmonkey的程序,如下所示

#include <iostream>
#include <iterator>#include "csvmonkey.hpp"
using namespace csvmonkey;int main(int argc, char* argv[])
{if(argc < 2) {return 1;}MappedFileCursor cursor;if(! cursor.open(argv[1])) {// new behaviour for csvmonkey returns 0 for empty files.std::cout << 0 << std::endl;return 0;}CsvReader reader(cursor);CsvCursor &row = reader.row();int sum = 0;while(reader.read_row()) {sum += row.count;}std::cout << sum << std::endl;
}

它的主要实现都在头文件csvmonkey.hpp里,找来编译执行了,结果不太快,500万行的读取正确,用时23秒,100万行41列的读取失败,没有文档,不知怎么改。

wget https://raw.githubusercontent.com/dw/csvmonkey/csv-game/csvmonkey.hppg++ csv.cc -w -pedantic -std=c++11 -g -O3 -fpic -msse4.2 -march=native -DNDEBUG -o csvmonkey -I .root@6ae32a5ffcde:/par# time ./csvmonkey "5m Sales Records.csv"
70000000real    0m23.437s
user    0m0.388s
sys     0m1.325s
root@6ae32a5ffcde:/par# time ./csvmonkey "NYC_311_SR_2010-2020-sample-1M.csv"
1060693607
Segmentation fault (core dumped)real    0m19.954s
user    0m0.194s
sys     0m1.147s

再拿基于libcsv的程序来测,它在列表中是第8名

#include <csv.h>
#include <stdio.h>
#include <string.h>void field_count(void* str, size_t str_len, void* data) {int* count = (int*)data;*count += 1;
}const int READ_SZ = 1024 * 1024;int main (int argc, char* argv[]) {struct csv_parser parser = {0};csv_init(&parser, CSV_APPEND_NULL);FILE* f = fopen(argv[1], "r");char *buf = (char*)malloc(READ_SZ);size_t buflen = READ_SZ;int count = 0; while((buflen = fread(buf, 1, READ_SZ, f))  > 0){csv_parse(&parser, buf, buflen, field_count, 0, &count);}printf("%d\n", count);fclose(f);free(buf);csv_free(&parser);return EXIT_SUCCESS;
}

效果好了很多,都在3秒左右,但读出的列数有点差距,应该是标题行影响,但第一个难以理解,14列怎么读成13列了。

gcc csv.c libcsv.c -Werror -Wall -pedantic -std=c11 -g -O3 -fpic -march=native -o libcsv -I .
root@6ae32a5ffcde:/par# time ./libcsv "5m Sales Records.csv"
70000013real    0m3.608s
user    0m1.301s
sys     0m0.100s
root@6ae32a5ffcde:/par# time ./libcsv "NYC_311_SR_2010-2020-sample-1M.csv"
41000041real    0m3.078s
user    0m1.083s
sys     0m0.109s

再拿我常用的Duckdb来读,效率高了很多。读取统计行数都在2秒左右,写入内存表也不过增加了0.2秒。对读入的数据进行总结,内容也都正确。

D .timer on
D SET enable_progress_bar =false;D select count(*) from '5m Sales Records.csv';
┌────────────────┐
│  count_star()  │
│     int64      │
├────────────────┤
│    5000000     │
│ (5.00 million) │
└────────────────┘
Run Time (s): real 2.329 user 0.998917 sys 0.234929
D select count(*) from 'NYC_311_SR_2010-2020-sample-1M.csv';
┌────────────────┐
│  count_star()  │
│     int64      │
├────────────────┤
│    1000000     │
│ (1.00 million) │
└────────────────┘
Run Time (s): real 1.981 user 0.649826 sys 0.196659
D create table t as from '5m Sales Records.csv';
Run Time (s): real 2.585 user 3.853148 sys 0.752251
D summarize t;
┌────────────────┬─────────────┬─────────────┬────────────────────┬───┬────────────────────┬─────────┬─────────────────┐
│  column_name   │ column_type │     min     │        max         │ … │        q75         │  count  │ null_percentage │
│    varcharvarcharvarcharvarchar       │   │      varchar       │  int64  │  decimal(9,2)   │
├────────────────┼─────────────┼─────────────┼────────────────────┼───┼────────────────────┼─────────┼─────────────────┤
│ Region         │ VARCHAR     │ Asia        │ Sub-Saharan Africa │ … │ NULL50000000.00 │
│ Country        │ VARCHAR     │ Afghanistan │ Zimbabwe           │ … │ NULL50000000.00 │
│ Item TypeVARCHAR     │ Baby Food   │ Vegetables         │ … │ NULL50000000.00 │
│ Sales Channel  │ VARCHAR     │ Offline     │ Online             │ … │ NULL50000000.00 │
│ Order Priority │ VARCHAR     │ C           │ M                  │ … │ NULL50000000.00 │
│ Order DateDATE2010-01-012020-09-10         │ … │ 2018-01-0850000000.00 │
│ Order ID       │ BIGINT100000321999999892          │ … │ 77539938850000000.00 │
│ Ship DateDATE2010-01-012020-10-30         │ … │ 2018-02-0150000000.00 │
│ Units Sold     │ BIGINT110000              │ … │ 749850000000.00 │
│ Unit Price     │ DOUBLE9.33668.27             │ … │ 428.793747566488850000000.00 │
│ Unit Cost      │ DOUBLE6.92524.96             │ … │ 307.0304857341750000000.00 │
│ Total Revenue  │ DOUBLE9.336682700.0          │ … │ 1823813.983183333750000000.00 │
│ Total Cost     │ DOUBLE6.925249600.0          │ … │ 1203364.150452026950000000.00 │
│ Total Profit   │ DOUBLE2.411738700.0          │ … │ 566819.027875001550000000.00 │
├────────────────┴─────────────┴─────────────┴────────────────────┴───┴────────────────────┴─────────┴─────────────────┤
│ 14 rows                                                                                         12 columns (7 shown) │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.792 user 10.106701 sys 0.037936
D create table t2 as from 'NYC_311_SR_2010-2020-sample-1M.csv';
Run Time (s): real 2.285 user 2.901837 sys 0.686295
D summarize t2;
┌──────────────────────┬─────────────┬──────────────────────┬───┬──────────────────────┬─────────┬─────────────────┐
│     column_name      │ column_type │         min          │ … │         q75          │  count  │ null_percentage │
│       varcharvarcharvarchar        │   │       varchar        │  int64  │  decimal(9,2)   │
├──────────────────────┼─────────────┼──────────────────────┼───┼──────────────────────┼─────────┼─────────────────┤
│ Unique KeyBIGINT11465364             │ … │ 4020821610000000.00 │
│ Created DateTIMESTAMP2010-01-01 00:00:00  │ … │ 2018-07-30 12:48:4…  │ 10000000.00 │
│ Closed DateTIMESTAMP1900-01-01 00:00:00  │ … │ 2018-08-04 11:42:5…  │ 10000002.86 │
│ Agency               │ VARCHAR3-1-1                │ … │ NULL10000000.00 │
│ Agency Name          │ VARCHAR3-1-1                │ … │ NULL10000000.00 │
│ Complaint TypeVARCHAR../../WEB-INF/web.…  │ … │ NULL10000000.00 │
│ Descriptor           │ VARCHAR1 Missed Collection  │ … │ NULL10000000.30 │
│ Location TypeVARCHAR1-, 2- and 3- Fami…  │ … │ NULL100000023.91 │
│ Incident Zip         │ VARCHAR*                    │ … │ NULL10000005.50 │
│ Incident Address     │ VARCHAR* *                  │ … │ NULL100000017.47 │
│ Street Name          │ VARCHAR*                    │ … │ NULL100000017.47 │
│ Cross Street 1VARCHAR1 AVE                │ … │ NULL100000032.04 │
│ Cross Street 2VARCHAR1 AVE                │ … │ NULL100000032.36 │
│ Intersection Stree…  │ VARCHAR1 AVE                │ … │ NULL100000076.74 │
│ Intersection Stree…  │ VARCHAR1 AVE                │ … │ NULL100000076.77 │
│ Address TypeVARCHAR     │ ADDRESS              │ … │ NULL100000012.58 │
│ City                 │ VARCHAR*                    │ … │ NULL10000006.20 │
│ Landmark             │ VARCHAR1 AVENUE             │ … │ NULL100000091.28 │
│ Facility TypeVARCHAR     │ DSNY Garage          │ … │ NULL100000014.55 │
│ StatusVARCHAR     │ Assigned             │ … │ NULL10000000.00 │
│ Due DateTIMESTAMP1900-01-02 00:00:00  │ … │ 2017-09-22 19:44:2…  │ 100000064.78 │
│ Resolution Descrip…  │ VARCHAR     │ A DOB violation wa…  │ … │ NULL10000002.05 │
│ Resolution Action …  │ TIMESTAMP2009-12-31 01:35:00  │ … │ 2018-08-10 13:25:1…  │ 10000001.51 │
│ Community Board      │ VARCHAR0 Unspecified        │ … │ NULL10000000.00 │
│ BBL                  │ VARCHAR0000000000           │ … │ NULL100000024.30 │
│ Borough              │ VARCHAR     │ BRONX                │ … │ NULL10000000.00 │
│ X Coordinate (Stat…  │ BIGINT913281               │ … │ 101825510000008.53 │
│ Y Coordinate (Stat…  │ BIGINT121152               │ … │ 23490710000008.53 │
│ Open Data Channel …  │ VARCHAR     │ MOBILE               │ … │ NULL10000000.00 │
│ Park Facility Name   │ VARCHAR"Uncle" Vito F. Ma…  │ … │ NULL10000000.00 │
│ Park Borough         │ VARCHAR     │ BRONX                │ … │ NULL10000000.00 │
│ Vehicle TypeVARCHAR     │ Ambulette / Paratr…  │ … │ NULL100000099.97 │
│ Taxi Company Borough │ VARCHAR     │ BRONX                │ … │ NULL100000099.92 │
│ Taxi Pick Up Locat…  │ VARCHAR1 5 AVENUE MANHATTAN │ … │ NULL100000099.21 │
│ Bridge Highway Name  │ VARCHAR145th St. Br - Len…  │ … │ NULL100000099.77 │
│ Bridge Highway Dir…  │ VARCHAR     │ Bronx Bound          │ … │ NULL100000099.77 │
│ Road Ramp            │ VARCHAR     │ N/A                  │ … │ NULL100000099.77 │
│ Bridge Highway Seg…  │ VARCHAR1-1-1265963747       │ … │ NULL100000099.76 │
│ Latitude             │ DOUBLE40.1123853           │ … │ 40.80288457482914100000025.47 │
│ Longitude            │ DOUBLE-77.5195844          │ … │ -73.87602468658496100000025.47 │
│ Location             │ VARCHAR(40.1123853, -77.5…  │ … │ NULL100000025.47 │
├──────────────────────┴─────────────┴──────────────────────┴───┴──────────────────────┴─────────┴─────────────────┤
│ 41 rows                                                                                     12 columns (6 shown) │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
Run Time (s): real 0.332 user 2.741898 sys 0.049018
http://www.lryc.cn/news/622800.html

相关文章:

  • C语言(11)—— 数组(超绝详细总结)
  • 【DP】单词的划分
  • 机器学习的特征工程(特征构造、特征选择、特征转换和特征提取)详解
  • MATLAB R2010b系统环境(二)MATLAB环境的准备
  • React手撕组件和Hooks总结
  • 自动化测试的下一站:AI缺陷检测工具如何实现“bug提前预警”?
  • illustrator插件大全 免费插件介绍 Ai设计插件集合 (3)
  • 知识点汇总linuxC高级 -2系统命令压缩与链接
  • 机器学习相关算法:回溯算法 贪心算法 回归算法(线性回归) 算法超参数 多项式时间 朴素贝叶斯分类算法
  • 022 基础 IO —— 文件
  • [系统架构设计师]系统质量属性与架构评估(八)
  • 【完整源码+数据集+部署教程】太阳能面板污垢检测系统源码和数据集:改进yolo11-RVB-EMA
  • Golang Seata 分布式事务方案详解
  • 正点原子【第四期】Linux之驱动开发篇学习笔记-1.1 Linux驱动开发与裸机开发的区别
  • MySQL 从入门到精通 9:视图
  • 【lucene】SegmentInfos
  • 并查集理论基础, 107. 寻找存在的路径
  • 零改造迁移实录:2000+存储过程从SQL Server滑入KingbaseES V9R4C12的72小时
  • 生产环境Redis缓存穿透与雪崩防护性能优化实战指南
  • CSV 生成 Gantt 甘特图
  • 解锁JavaScript性能优化:从理论到实战
  • 【数据分享】上市公司供应链成本分摊数据(2007-2024)
  • Cursor执行命令卡顿解决办法(Cursor卡住、Cursor命令卡住、Cursor执行慢、Cursor执行命令慢)改成以管理员身份运行就好!!!
  • redis存储原理与对象模型
  • 数据结构初阶(16)排序算法——归并排序
  • FFmpeg QoS 处理
  • 《WINDOWS 环境下32位汇编语言程序设计》第2章 准备编程环境
  • 汽车行业供应链EDI标准体系解析:构建高效协同的数字桥梁
  • Blackwell 和 Hopper 架构的 GPGPU 新功能全面综述
  • 要导入StandardScaler类进行数据标准化,请使用以下语句: