前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >超大CSV文件如何最快速度解析

超大CSV文件如何最快速度解析

作者头像
林老师带你学编程
发布于 2023-04-03 01:08:48
发布于 2023-04-03 01:08:48
1.6K0
举报
文章被收录于专栏:强仔仔强仔仔

背景:今天被人问到一个10G的超大CSV如何最快速度读取,并插入到数据库中。一般读取文件都是单线程一直往下读,但是如果文件特别大的情况下就会很慢。如何快速读取?脑海里面"多线程"一下子就浮出水面了,想要快速读取文件,肯定得多线程一起读取。那问题来了,一个文件怎么样进行多线程读取,首先得知道每个线程要负责读取的位置,才可以多线程完整的读取一行的数据。

linux文件底层存储结构

在回答这个问题之前,我们先要了解一下linux操作系统底层是如何存储文件的,知道这个底层原理之后,我们才能更好的问答这个问题。

从上图我们可以看出,操作系统里面包含文件系统,可以快速根据文件路径定位到文件具体位置,文件本身并非直接存储在磁盘上面的,一个文件由很多块组成,根据不同的文件系统,每一个块的默认大小也都不一样,比如在 Windows 系统下,默认的 NTFS 文件系统的文件块大小为 4KB。

读取方案设计

想要最快速度读取文件里面的内容,无疑要用到多线程,那如何用多线程去读取文件呢?这也是有所讲究的,如果用错方法可能多线程的速度还不如单线程去获取。

按行多线程读取

直接读取文件的总行数,然后按照10个线程来计算,每一个线程要处理多少范围行数的数据,最后线程各自对同一份文件进行数据处理。

这种方案最大的问题就是忽略了各个线程在读取指定行数的复杂度,并非O(1)而是O(n),所以线程在读取文件的时候,检索数据这个过程会耗费一定时间,总体查询速度并不高,甚至可能比单线程更慢。

大转小后多线程读取

将大文件拆分为一个个小文件,然后多线程去读取各个小文件,这样速度会比读取一个大文件快很多,而且读取的程序也比较简单。

例如linux提供了split命令,可以按照行和字节进行拆分。但是不管是按照行或者字节,底层都是通过直接多线程读取文件块,来快速处理的。

split在按行拆分的情况下,如果要处理大量的文件,可以将每个文件拆分成若干个块,然后使用多线程来同时处理这些块,以提高拆分效率。每个线程读取一个块,处理完后,将结果保存到对应的输出文件中。 在按字节拆分的情况下,同样可以使用多线程来加快拆分速度。可以将文件划分为若干个块,每个线程读取一个块,然后根据指定的字节数进行拆分,并将结果保存到对应的输出文件中。

这种大文件转小文件,然后多线程读取的方式,如果是离线分析,那肯定是首选,但是如果是在线程序分析,将文件拆分再读取,过程会很繁琐,实现上面也比较复杂,也不是非常推荐这种方案。

多线程按块读取

获取文件的size,假如文件是10G,按照10线程,每一个线程负责1G范围的数据检索,例如线程1负责0指针位置的块,线程2负责1G指针位置块,到线程10负责9G指针位置块。

除了1线程,其它线程都从原本位置向前查找换行符,找到之后从当下位置开始,一直读取到2G位置的下一个换行符。这样就可以多线程快速的读取一个文件的数据,但是会有极少数数据的重复获取。

因为按照字节位置索引文件的复杂度是O(1),也就是知道文件的指针之后,可以马上读取该指针下的数据,这样可以避免第一种方案中需要遍历一遍文件内容,才能找到对应行的指针位置的问题。多线程按块读取方案相对上面两种,无疑是最快的一种方式。

复盘总结

其实多线程按块读取之后还可以继续优化,为什么呢?因为线程再多,最大的读取速度也受限于:文件所在机器的IO、应用机器和文件所在机器的网络、应用机器的IO这几方面,可以继续在这几方面优化。看似简单大文件读取操作,却涉及底层文件系统。所以处理问题或者设计方案,一定要多考虑几层,可以基于底层原理来设计方案,才是最可靠的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
高频js笔试题看这一篇就够了
类的继承在几年前是重点内容,有n种继承方式各有优劣,es6普及后越来越不重要,那么多种写法有点『回字有四样写法』的意思,如果还想深入理解的去看红宝书即可,我们目前只实现一种最理想的继承方式。
helloworld1024
2022/11/04
7640
由浅入深,66条JavaScript面试知识点
来源:https://juejin.im/post/5ef8377f6fb9a07e693a6061
zz_jesse
2020/07/07
1K0
由浅入深,66条JavaScript面试知识点
利用这 66 条 JS 知识抓住年底最后一次跳槽涨薪的机会
作者: Jake Zhang https://juejin.cn/post/6844904200917221389
用户4456933
2021/06/01
7030
利用这 66 条 JS 知识抓住年底最后一次跳槽涨薪的机会
100道+ JavaScript 面试题,助你查漏补缺
详细资料可以参考: 《JavaScript 有几种类型的值?》 《JavaScript 有几种类型的值?能否画一下它们的内存图;》
前端达人
2020/04/08
9000
JavaScript 面试知识点总结
本部分主要是笔者在复习 JavaScript 相关知识和一些相关面试题时所做的笔记,如果出现错误,希望大家指出!
不愿意做鱼的小鲸鱼
2022/09/24
4080
signature=0fdde99449705347b1bc3148e0519684,yarn.lock · mirrors_yeoman/generator-generator – Gitee.co
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
全栈程序员站长
2022/10/02
4540
入坑!通过ajaxreturn jquery json提交form
\Think\Controller类提供了ajaxReturn方法用于AJAX返回数据给客户端(视图、模板、js等)。并且支持JSON、JSONP、XML和EVAL四种方式给客户端接受数据(默认JSON)。
PM吃瓜
2019/08/12
5K0
入坑!通过ajaxreturn jquery json提交form
前端基础进阶(十七):详解 ES6 Modules
历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
唐志远
2022/10/27
1.2K0
编写可维护的JavaScript
• 在方法中的局部变量(local variable)和第一条语句之间
硬核项目经理
2019/08/07
8640
JQuery-命令速查-CheatSheet
http://stackoverflow.com/questions/31379409/form-submission-causing-maximum-call-stack-size-exceeded
szhshp
2022/09/21
9.8K0
2021前端面试必备题+答案
如果是 HTTP 1.0 版本协议,一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个 TCP 发送一个 HTTP 请求,但是有一种情况可以将一条 TCP 连接保持在活跃状态,那就是通过 Connection 和 Keep-Alive 首部,在请求头带上 Connection: Keep-Alive,并且可以通过 Keep-Alive 通用首部中指定的,用逗号分隔的选项调节 keep-alive 的行为,如果客户端和服务端都支持,那么其实也可以发送多条,不过此方式也有限制,可以关注《HTTP 权威指南》4.5.5 节对于 Keep-Alive 连接的限制和规则。
zz1998
2021/07/06
8110
Python全栈之jQuery笔记
jQuery runnoob网址: http://www.runoob.com/jquery/jquery-tutorial.html jQuery API手册: http://www.runoob.com/manual/jquery/ jQuery笔记 笔记来源于: 传智播客的黑马程序员视频笔记. 菜鸟教程:http://www.runoob.com/ 自己的查询与整理. JS的不完美地方: 1. 代码比较麻烦,给多个元素添加事件需要遍历,可能还需要进行嵌套.
py3study
2020/01/19
5.5K0
快速学习-综合案例RESTRUL_CRUD
发起请求,无法执行,因为delete请求必须通过post请求转换为delete请求,借助:HiddenHttpMethodFilter过滤器
cwl_java
2020/02/19
1.8K0
快速学习-综合案例RESTRUL_CRUD
前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
使用vue-cli可以规范项目,提高开发效率,但是使用vue-cli时需要一些ECMAScript6的知识,特别是ES6中的模块管理内容,本章先介绍ES6中的基础与模块化的内容再使用vue-cli开发vue项目。 一、ECMAScript6概要 ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通过ECMA-262标准化的脚本程序设计语言。这种语言在万维网上应用广泛,它往往被称为JavaSc
张果
2018/03/30
1.8K0
前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
从零实现的浏览器Web脚本
在之前我们介绍了从零实现Chrome扩展,而实际上浏览器级别的扩展整体架构非常复杂,尽管当前有统一规范但不同浏览器的具体实现不尽相同,并且成为开发者并上架Chrome应用商店需要支付5$的注册费,如果我们只是希望在Web页面中进行一些轻量级的脚本编写,使用浏览器扩展级别的能力会显得成本略高,所以在本文我们主要探讨浏览器Web级别的轻量级脚本实现。
WindRunnerMax
2023/11/04
8420
一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序
现在我们可以app.component.html用这个替换:Angular是由Google开发的AngularJS框架的新版本。它带有一个完整的重写,以及各种改进,包括优化构建和更快的编译时间。在这个Angular 5教程中,我们将从头开始构建一个笔记应用程序。如果您一直在等待学习Angular 5,本教程适合您。
WindCoder
2018/09/19
42.8K0
一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序
Airflow速用
Airflow是Apache用python编写的,用到了 flask框架及相关插件,rabbitmq,celery等(windows不兼容);、
用户1558882
2019/10/31
5.5K0
jquery 实现点击图片居住放大缩小
该功能是基于jquery实现的,所以 第一步则是引入jquery jquery下载地址:https://jquery.com/download/ 或者使用此时调试的版本(3版本) /*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ !function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.expo
wfaceboss
2019/04/08
17.3K0
【原创】前端面试知识体系(一)
我的博客来源:https://1024bibi.com/2018/01/01/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E7%9F%A5%E8%AF%86%E4%BD%93%E7%B3%BB%EF%BC%88%E4%B8%80%EF%BC%89/
达达前端
2023/10/08
2870
2018年最全面的前端面试题都在这里了
意义:根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地解析。 注意: 1.尽可能少的使用无语义的标签div和span; 2.在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利; 3.不要使用纯样式标签,如:b、font、u等,改用css设置。 4.需要强调的文本,可以包含在strong或者em标签中(浏览器预设样式,能用CSS指定就不用他们),strong默认样式是加粗(不要用b),em是斜体(不用i); 5.使用表格时,标题要用caption,表头用thead,主体部分用tbody包围,尾部用tfoot包围。表头和一般单元格要区分开,表头用th,单元格用td; 6.表单域要用fieldset标签包起来,并用legend标签说明表单的用途; 7.每个input标签对应的说明文本都需要使用label标签,并且通过为input设置id属性,在lable标签中设置for=someld来让说明文本和相对应的input关联起来。
前端达人
2018/10/16
7.6K0
相关推荐
高频js笔试题看这一篇就够了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文