Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >超大CSV文件如何最快速度解析

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

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

背景:今天被人问到一个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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大文件拆分方案的Java实践【面试+工作】
大文件拆分问题涉及到io处理、并发编程、生产者/消费者模式的理解,是一个很好的综合应用场景,为此,花点时间做一些实践,对相关的知识做一次梳理和集成,总结一些共性的处理方案和思路,以供后续工作中借鉴。
Java帮帮
2018/09/29
3.1K0
大文件拆分方案的Java实践【面试+工作】
阿里终面:10亿数据如何快速插入MySQL?
最快的速度把10亿条数据导入到数据库,首先需要和面试官明确一下,10亿条数据什么形式存在哪里,每条数据多大,是否有序导入,是否不能重复,数据库是否是MySQL?
搜云库技术团队
2023/10/30
2.9K0
阿里终面:10亿数据如何快速插入MySQL?
实战篇:断点续传?文件秒传?手撸大文件上传
最近接到一个新的需求,需要上传2G左右的视频文件,用测试环境的OSS试了一下,上传需要十几分钟,再考虑到公司的资源问题,果断放弃该方案。
阿Q说代码
2021/09/09
1.1K1
实战篇:断点续传?文件秒传?手撸大文件上传
从青铜到王者系列:深入浅出理解 DeepSeek 3FS(1)
这里从零实现一个3FS文件系统开始。 探讨 讲背后计算网络,内存,文件,cpu串联起来。
早起的鸟儿有虫吃
2025/03/19
3020
从青铜到王者系列:深入浅出理解 DeepSeek 3FS(1)
JAVA几分钟就能处理完30亿个数据?
现有一个 10G 文件的数据,里面包含了 18-70 之间的整数,分别表示 18-70 岁的人群数量统计,假设年龄范围分布均匀,分别表示系统中所有用户的年龄数,找出重复次数最多的那个数,现有一台内存为 4G、2 核 CPU 的电脑,请写一个算法实现。
二哥聊运营工具
2022/07/11
3790
JAVA几分钟就能处理完30亿个数据?
⭐Python实现多线程并发下载大文件(制作支持断点续传的下载器的绝佳参考⁉️)⭐
不知道各位童鞋们是否遇到过需要使用python下载大文件的需求,或者需要从一些网速很慢的网站上下载文件。如果你在实际下载过程碰到下载不稳定经常失败的情况,本文的方法将会给你带来一些解决思路和方案。
全栈程序员站长
2022/09/13
2.3K0
⭐Python实现多线程并发下载大文件(制作支持断点续传的下载器的绝佳参考⁉️)⭐
python技术面试题(一)
If you change nothing, nothing will change
小闫同学啊
2019/07/18
7600
python技术面试题(一)
【万字长文】HDFS最全知识点整理(建议收藏)
1)跟NN通信查询元数据(block所在的DN的节点),找到文件块所在的DN的服务器。2)挑选一台DN(就近原则,然后随机)服务器,请求建立socket流。3)DN开始发送数据(从磁盘里读取数据放入流,一packet为单位做校验) 4)客户端以packet为单位接收,现在本地缓存,然后写入目标文件中,后面的block块就相当于append到前面的block块,最后合成最终需要的文件。
857技术社区
2022/05/17
3.2K0
【万字长文】HDFS最全知识点整理(建议收藏)
使用 Go 打造百亿级文件系统的实践之旅
JuiceFS 企业版是一款为云环境设计的分布式文件系统,单命名空间内可稳定管理高达百亿级数量的文件。
深度学习与Python
2024/02/17
2910
使用 Go 打造百亿级文件系统的实践之旅
Linux后台开发必看(给进军bat的你)
白嫖不好,要不先赞在看! 一 自我介绍 本人小硕,秋招期间参加了不少安全类相关公司(深信服,绿盟等),另外参加了京东,小米,滴滴等互联网公司面试,同时也面试了几个研究所和一个银行,下面总结下秋招相关情况。 二 面试情况 公司名称 面试岗位 面试情况 小米 Linux内核开发 三面!挂 深信服
我是程序员小贱
2020/03/26
1.7K0
Linux后台开发必看(给进军bat的你)
Linux 性能调优之文件系统调优
不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树
山河已无恙
2024/02/26
9950
Linux 性能调优之文件系统调优
干货 | JuiceFS 在携程海量冷数据场景下的实践
作者简介 妙成,携程云原生研发工程师,主要从事Elasticsearch、JuiceFS的研发运维,关注分布式数据库、NoSQL。 小峰, 携程云原生研发工程师,主要专注于数据库容器化领域,对分布式存储有浓厚兴趣。 一、摘要 携程的冷数据规模在 10PB+,包括备份数据、图片语音训练数据和日志数据等,存储方案主要是本地磁盘和GlusterFS。在实际使用中这些方案遇到了不少痛点: GlusterFS 在单目录下文件众多时,ls命令速度很慢;  受疫情期间机器采购周期的制约,无法灵活地根据实际需求弹性扩缩容
携程技术
2022/08/25
6400
干货 | JuiceFS 在携程海量冷数据场景下的实践
一份高质量的后台开发面经,注意收藏
这篇文章来源于我的一位朋友,和我一样参加了去年了秋招,这份面经我看了下,很多问题都是高频面试题,而且总结的挺全,在此分享给大家。先看下大致目录
帅地
2020/02/25
1.5K0
基于 NVMe SSD 的分布式文件存储 UFS 性能提升技术解析
为了应对 IO 性能要求很高的数据分析、AI 训练、高性能站点等场景,UFS 团队又推出了一款基于 NVMe SSD 介质的性能型 UFS,以满足高 IO 场景下业务对共享存储的需求。性能型 UFS 的 4K 随机写的延迟能保持在 10ms 以下,4K 随机读延迟在 5ms 以下。
PingCAP
2020/02/04
1.2K1
分布式文件系统—Google File System介绍
我们知道如要要从磁盘取数据,需要告诉控制器从哪取,取多长等信息,如果这步由应用来做,那实在太麻烦。所以操作系统提供了一个中间层,它管理本地的磁盘存储资源、提供文件到存储位置的映射,并抽象出一套文件访问接口供用户使用。对用户来说只需记住文件名和路径,其他的与磁盘块打交道的事就交给这个中间层来做,这个中间层即为文件系统。
MySQL轻松学
2019/11/12
2.2K0
分布式文件系统—Google File System介绍
一次大数据文件处理日记
最近在做业务功能的时候,拿到一个非常"简单"的需求,把一个 30万行的数据文件按照特定的格式进行入库,文件格式和字段的内容都有对应的规定。这种需求其实还算比较常见,通常这一类需求不管系统配置多么强悍,都不可能无脑的读取插入。趁着这个需求搜集了一下几种常见的做法。下面就来介绍一下解决这种大数据文件的常用套路。
阿东
2021/08/16
5250
常见开源分布式文件系统架构对比
文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式。在不同的操作系统中,文件系统会有一些差别,但也有一些共性几十年都没怎么变化:
Juicedata
2021/12/10
1.3K0
常见开源分布式文件系统架构对比
Linux后台开发必看!
一 自我介绍二 面试情况三 相关知识点汇总1 c/c++相关2 计算机网络3 数据结构相关4 数据库相关5 操作系统6 Linux基础知识及应用编程(后台必备!)7 大数问题8 手撕算法(递归非递归)9 针对项目相关10 场景题11 架构/分布式/中间件相关12 总结
公众号guangcity
2020/02/24
3.5K0
hdfs——nn的启动优化
上一篇文章讲解了,在一定DN节点规模,一定block数据量下的并发写文件的优化问题。
陈猿解码
2023/02/28
2970
hdfs——nn的启动优化
天池中间件大赛百万队列存储设计总结【复赛】
维持了 20 天的复赛终于告一段落了,国际惯例先说结果,复赛结果不太理想,一度从第 10 名掉到了最后的第 36 名,主要是写入的优化卡了 5 天,一直没有进展,最终排名也是定格在了排行榜的第二页。痛定思痛,这篇文章将自己复赛中学习的知识,成功的优化,未成功的优化都罗列一下。
kirito-moe
2018/07/25
1.1K0
天池中间件大赛百万队列存储设计总结【复赛】
推荐阅读
相关推荐
大文件拆分方案的Java实践【面试+工作】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档