网易首页 > 网易号 > 正文 申请入驻

1亿行JSONL文件 grep要跑3小时?这群人把它压到47秒

0
分享至


扫描1亿行JSONL文件,传统grep需要3小时。有人用C语言+线程池,把它压到47秒。这不是魔法,是文件切分策略的暴力美学。

问题本质:为什么grep会卡在IO上

单线程grep的瓶颈从来不是CPU。你看着100%的CPU占用,其实是IO等待的假象——现代SSD的随机读取延迟,能把顺序扫描变成随机漫步。

JSONL(每行一个JSON对象)的麻烦在于:你不能随便切分。在文件中间砍一刀,可能正好落在某个JSON对象内部,解析直接崩溃。

解决方案听起来像作弊:先按字节偏移粗暴切分,再让每个线程"倒车"找换行符。

具体做法是:测量文件总大小(一个系统调用),按线程数均分偏移量。每个工作线程从自己的起点往回扫,直到碰到`\n`,确保段落边界对齐。剩下的就是纯计算——每个线程独立处理自己的文本块,最后合并结果。

这个思路直接借鉴了1BRC(十亿行挑战)的获胜方案。那个比赛比的是处理10亿行温度数据谁最快,冠军用Java做到了1.5秒。核心秘诀一模一样:mmap文件进内存,SIMD指令并行解析,线程池按行边界分治。

ripgrep已经做了,为什么还有人想重写


评论区有人直接甩出ripgrep(rg)。确实,rg内部就是并行架构,Rust写的,默认开启8线程,对大多数人来说"开箱即用"就够了。

但提问者明确说:我想用C写。

这个选择暴露了一个工程直觉——当文件大到内存装不下,或者需要嵌入现有C代码库时,从头控制每个字节比依赖黑箱更踏实。rg的并行是通用的,你的场景可能是专用的:比如只匹配特定JSON字段,或者匹配结果需要实时流式输出到下游管道。

技术选型永远是个权衡矩阵。GNU parallel的方案也被提到:`parallel --pipe`可以把stdin切成块喂给多个grep进程,`--pipepart`更激进,直接按文件偏移并行。但进程池的上下文切换开销,在C线程池面前像个胖子过独木桥。

有个评论被顶到了前面:「把JSON塞进SQL建索引」。这条建议收获了最多"踩"。

数据导入的时间成本,在"只想扫一遍"的场景下是致命的。 就像为了查一个电话,先把整本黄页录入数据库。索引是写给反复查询的情书,grep是写给一次性扫描的战书。

C实现的两个岔路口

回到C语言的实现路径,摆在面前的是经典的分工问题:自己造轮子,还是借openMP的东风?


手写线程池的好处是可控。你可以精确决定任务粒度——是按固定行数分包,还是按字节偏移动态平衡。1BRC的冠军方案里有个细节:线程数不是简单的CPU核心数,而是根据L3缓存大小调整,确保工作集不跨NUMA节点。

openMP的路线则是另一种哲学。几行编译指令就能把循环并行化,适合快速验证想法。代价是调试地狱——当某个线程在文件边界处踩了内存,你拿到的core dump是一团模糊的影子。

有个被忽略的细节:正则引擎的选择。PCRE2功能全但慢,Hyperscan(Intel的)用SIMD批量匹配,在固定模式场景下能快10倍。如果你的JSONL查询是固定字段匹配,甚至可以把正则编译成DFA,省掉回溯的麻烦。

文件切分本身也有坑。`\n`换行是Unix的假设,Windows的`\r\n`会让"倒车"逻辑多一个状态判断。更隐蔽的是UTF-8——如果切分点正好落在一个多字节字符中间,字符串匹配会漏掉跨边界的模式。防御性做法是在找换行符时,同时检查UTF-8的continuation byte标记。

工程的最后1%:聚合与输出

并行扫描的终点是结果合并。最简单的办法是每个线程写自己的临时文件,最后cat在一起。但磁盘IO的串行化会吃掉并行带来的收益。

更好的设计是线程本地缓冲区+无锁队列。主线程消费队列,按原始顺序输出。如果结果顺序不重要(大多数grep场景),可以直接并发写标准输出,依赖内核的pipe缓冲机制自然排序。

内存映射(mmap)是另一个加速器。把文件直接映射进虚拟地址空间,省掉read()的系统调用和数据拷贝。代价是page fault的处理延迟,以及大文件可能撑爆虚拟内存。1BRC的选手们在这个点上反复横跳:有人用mmap+madvise顺序预读,有人坚持用传统的read()+自定义缓冲池,实测后者在某些SSD上更快。

最后有个冷知识:现代CPU的向量指令(AVX-512)可以一次比较64字节。把JSONL的文本扫描改成SIMD实现,单线程就能顶原来4-8个线程的吞吐量。但代码可维护性会断崖下跌——你写的是汇编,不是C。

提问者没说的是:这1亿行JSONL从哪来,又要到哪去。是日志分析的中间环节,还是数据迁移的一次性任务?答案会彻底改变技术栈的选择。如果这是你正在面对的问题,你会为了47秒的胜利,跳进C语言和内存管理的深水区吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
4月1日全国天眼全覆盖!8大开车陋习严查,扣分罚款早知道

4月1日全国天眼全覆盖!8大开车陋习严查,扣分罚款早知道

复转这些年
2026-03-31 19:41:26
游客同里古镇景区拍照遭商家驱赶抢夺手机,当地:对涉事商户停业整改

游客同里古镇景区拍照遭商家驱赶抢夺手机,当地:对涉事商户停业整改

都市快报橙柿互动
2026-04-01 10:59:51
谁“毁”了单依纯?是常石磊的再造,还是被过早采摘的宿命?

谁“毁”了单依纯?是常石磊的再造,还是被过早采摘的宿命?

非常先生看娱乐
2026-03-31 16:20:58
阿根廷5-0,可怕的不是大胜,而是梅西的无私!卫冕世界杯真有戏

阿根廷5-0,可怕的不是大胜,而是梅西的无私!卫冕世界杯真有戏

球场没跑道
2026-04-01 10:06:19
演员宋宁峰发长文回应出轨,并宣布无限期暂停所有演艺工作

演员宋宁峰发长文回应出轨,并宣布无限期暂停所有演艺工作

韩小娱
2026-04-01 11:15:08
演员宋宁峰道歉,宣布无限期暂停演艺工作,“都是我的错,是我出轨在先,女儿,爸爸对不起你”

演员宋宁峰道歉,宣布无限期暂停演艺工作,“都是我的错,是我出轨在先,女儿,爸爸对不起你”

都市快报橙柿互动
2026-04-01 11:46:55
震惊!网传一家族群清明收费1850元,网友:我老死也不与家族来往

震惊!网传一家族群清明收费1850元,网友:我老死也不与家族来往

火山詩话
2026-03-31 16:22:45
武汉多辆“萝卜快跑”车辆停在路中间无法移动,业内人士分析:或因系统安全自检导致车辆停摆,武汉交警通报:无人员受伤,详细原因还在进一步调查

武汉多辆“萝卜快跑”车辆停在路中间无法移动,业内人士分析:或因系统安全自检导致车辆停摆,武汉交警通报:无人员受伤,详细原因还在进一步调查

极目新闻
2026-04-01 07:37:39
AI妓馆爆了!成人行业彻底变天!

AI妓馆爆了!成人行业彻底变天!

广告案例精选
2026-04-01 08:47:04
刚从日本回来,说点不中听的:日本的真实面目,可能让你很意外

刚从日本回来,说点不中听的:日本的真实面目,可能让你很意外

复转这些年
2026-04-01 09:17:19
中巴呼吁立即停火止战

中巴呼吁立即停火止战

环球时报国际
2026-04-01 11:55:26
34岁法国车手,骑张雪机车在顶级赛事中夺冠:曾在圈内人眼里已完全告别主流摩托赛事,“落魄十年”重回巅峰

34岁法国车手,骑张雪机车在顶级赛事中夺冠:曾在圈内人眼里已完全告别主流摩托赛事,“落魄十年”重回巅峰

极目新闻
2026-03-31 20:09:28
并列历史第一!詹姆斯第19次晋级季后赛 追平斯托克顿马龙纪录

并列历史第一!詹姆斯第19次晋级季后赛 追平斯托克顿马龙纪录

醉卧浮生
2026-04-01 09:51:03
中国有源相控阵雷达真实水平:并非世界第一,和美差距有多大

中国有源相控阵雷达真实水平:并非世界第一,和美差距有多大

番外行
2026-04-01 08:26:20
打!倾家荡产也要打!以色列最新民调:75%民众要求死磕到底!

打!倾家荡产也要打!以色列最新民调:75%民众要求死磕到底!

共工之锚
2026-03-30 15:16:22
金与正“转正”,朝鲜前总理变副总理

金与正“转正”,朝鲜前总理变副总理

中国新闻周刊
2026-04-01 07:35:12
美国纽约市宣布撤销政府设备使用TikTok禁令

美国纽约市宣布撤销政府设备使用TikTok禁令

界面新闻
2026-04-01 13:14:27
19岁女生被困柬埔寨,绑匪正脸照曝光,网友放话:你的下场会很惨

19岁女生被困柬埔寨,绑匪正脸照曝光,网友放话:你的下场会很惨

央小北
2026-04-01 02:35:51
美国国防部长:考虑到部分盟友拒绝提供帮助,特朗普将在对伊朗军事行动结束后就北约的未来作出决定

美国国防部长:考虑到部分盟友拒绝提供帮助,特朗普将在对伊朗军事行动结束后就北约的未来作出决定

潇湘晨报
2026-03-31 21:53:15
伟伟道来 | 全世界都在猜,美军要打哪里?

伟伟道来 | 全世界都在猜,美军要打哪里?

经济观察报
2026-04-01 10:55:06
2026-04-01 13:39:00
码上闲叙
码上闲叙
有态度网友ytd
1054文章数 8关注度
往期回顾 全部

科技要闻

营收翻倍、巨亏31亿!中国大模型太烧钱了

头条要闻

媒体:全世界都在猜美军要打哪里 美军或有三个目标

头条要闻

媒体:全世界都在猜美军要打哪里 美军或有三个目标

体育要闻

NBA扩军,和篮球无关?

娱乐要闻

宋宁峰人设崩塌!带娃偷情+反向索赔

财经要闻

电商售械三水光针 机构倒货or假货猖獗?

汽车要闻

2026年3月小米汽车交付超2万台 新SU7上市即交付

态度原创

房产
健康
游戏
旅游
军事航空

房产要闻

海口二手房,疯狂成交!贝壳最新数据曝光!

干细胞抗衰4大误区,90%的人都中招

《红色沙漠》翻身成功!好评率不降反升 3A游戏罕见

旅游要闻

平谷桃花节10日开幕:属马游客免门票,十万支糖葫芦免费送

军事要闻

特朗普:想要石油自己去霍尔木兹抢 我最想抢伊朗石油

无障碍浏览 进入关怀版