OpenClaw Press OpenCraw Press AI reporting, analysis, and editorial briefings with fast access to every public story.
article

尘土与星辰 -1992|第144章|进程与余量|中文

终端里的光标闪烁了两下,林尘敲下回车。 `import multiprocessing` 风扇立刻发出沉闷的嗡鸣。老旧的ThinkPad散热孔积了灰,热量顺着键盘边缘漫上来,烫得指尖发麻。他盯着屏幕,把50MB的CSV文件按行切分成四个块,分配给四个子进程。理

PublisherWayDigital
Published2026-04-20 09:04 UTC
Languagezh-CN
Regionglobal
CategoryInkOS Novels

第144章 进程与余量

终端里的光标闪烁了两下,林尘敲下回车。 import multiprocessing 风扇立刻发出沉闷的嗡鸣。老旧的ThinkPad散热孔积了灰,热量顺着键盘边缘漫上来,烫得指尖发麻。他盯着屏幕,把50MB的CSV文件按行切分成四个块,分配给四个子进程。理论很清晰:主进程读文件,子进程各自处理去重和对齐,最后汇总。但现实是,内存占用率瞬间飙到87%,硬盘读写灯狂闪,进度条卡在12%不动了。

他按下Ctrl+C,终止进程。终端吐出MemoryError。 林尘靠向椅背,左腿的肌肉不受控地抽了一下。他伸手按住膝盖,指节用力到泛白。痉挛持续了十几秒才缓缓平息。抽屉里的布洛芬只剩三粒。他数了数,没拿。疼是常态,药得留给真正动不了的时候。

他重新打开草稿纸。多进程不是把任务劈开就完事。CSV是纯文本,没有索引,直接按字节切分会把一行数据拦腰截断,导致解析错位。主键重复的判断需要全局视野,子进程各自为战,最后合并时必然漏掉跨块的重复项。他画了一个流程图:分块读取 → 局部去重 → 写入临时文件 → 主进程二次合并 → 输出最终表。逻辑通了,但I/O开销会成倍增加。他的硬盘是机械盘,读写速度只有每秒几十兆。频繁的小文件读写会让磁头来回寻道,直接拖死进度。

堂屋外传来脚步声。王桂英端着一只搪瓷缸进来,缸底沉着两片干姜和几粒冰糖。“喝点水。”她把缸子放在桌角,没看屏幕,“灶上煨了红薯粥,饿了自己盛。” “嗯。”林尘应了一声。 王桂英站了两秒,目光落在他微微发颤的左腿上,没问,转身带上门。门轴发出轻微的吱呀声。堂屋重新安静下来,只有风扇的嗡鸣和键盘的敲击声。

林尘端起搪瓷缸。水温刚好,姜的辛辣混着糖的甜,顺着喉咙滑下去,胃里泛起一点暖意。他重新坐直,把代码推倒重写。 不再用multiprocessing.Pool。改用Queue做缓冲,主进程按固定行数(5000行)读取,塞进队列。子进程从队列取数据,在内存里建一个字典做局部去重,处理完写回另一个队列。为了避开内存溢出,他把字典的键值对做了精简,只保留主键和最新时间戳。跨块重复的问题,留到最后一步用外部排序解决。他放弃了pandas,那东西吃内存太狠。改用内置的csv模块逐行解析,手动处理字段分割和类型转换。代码量增加了三倍,但内存 footprint 压到了可控范围。

代码敲到凌晨一点半。保存,运行。 终端跳出四行Process started。风扇转速拉高,但内存占用稳定在62%左右。进度条开始缓慢推进:1%... 3%... 8%... 林尘没有干等。他打开《Python数据分析实战》,翻到“外部排序与归并”一章。书上的算法用伪代码描述,他对照着逻辑,在草稿纸上推演归并树的层数。五十万行数据,分块后需要三次归并。每次归并都要读写磁盘。他的硬盘撑得住吗?他算了一下时间。如果顺利,大概需要四十分钟。如果不顺利,硬盘过热降速,可能拖到两小时。

凌晨两点十分,进度条停在47%。屏幕突然暗了一瞬。 林尘心里一紧。不是断电。是系统触发了保护机制,CPU降频了。风扇声音变小,进度条彻底停滞。 他起身,从床底拖出一个旧纸箱,翻出一把小刷子和一罐精密电器清洁剂。拧开笔记本后盖的螺丝,动作很轻,怕吵醒隔壁的小满。散热鳍片上糊着一层灰黑色的絮状物,导热硅脂已经干裂成粉末。他用刷子一点点清理,喷上清洁剂,用棉签擦净。装回后盖,拧紧螺丝。开机。 进度条从47%跳到了48%。风扇重新呼啸起来。 林尘坐回竹椅,揉了揉发酸的后颈。他想起周砚博客里的一句话:“工程不是跑通代码,是管理异常。”异常不只是数据里的乱码,还有硬件的衰老、环境的闷热、身体的极限。他必须把这些变量都算进去。他起身,在堂屋里慢慢踱步。左脚落地发虚,他就用右脚承重,走三步,停一下,拉伸小腿肌肉。循环往复。身体不能僵死,代码也不能。

三点四十分,进度条走到92%。 左腿的痉挛再次袭来,比上次更剧烈。他咬住下唇,没出声。手指在桌面上无意识地蜷缩,指甲掐进掌心。他深吸一口气,把注意力拉回屏幕。日志文件在后台滚动:[INFO] Chunk 12 merged. Duplicates removed: 402. [INFO] Timestamp aligned. Missing values filled with median. [WARN] Row 38412: Format mismatch, fallback to string parse. 他盯着那些日志。每一行都是规则。规则是他自己定的。他感到一种奇异的平静。贫穷、脚伤、信息差,这些曾经压得他喘不过气的东西,此刻被拆解成了可执行的步骤。他不需要一夜之间跨越阶层,他只需要让这五十万行数据,按他的逻辑排好队。

四点十五分,终端跳出Done. Total rows: 489,312. Output saved. 林尘关掉终端。打开输出文件。随机抽查二十行。主键唯一,时间戳连续,跨表关联字段完整。没有乱码,没有断裂。他跑了一遍校验脚本,错误率为零。 他长出一口气,身体向后靠去。竹椅发出轻微的呻吟。窗外的天色已经泛出灰白。蝉鸣还没开始,只有远处早班货车驶过县道的沉闷声响。 他打开邮箱,把处理后的CSV文件、日志文件,以及一份不到八百字的逻辑说明打包。附件命名:林尘_底层架构摸底_数据对齐与去重说明.pdf。点击发送。 收件人:zhouyan_lab@... 发送成功。

他合上电脑。从抽屉里拿出一个硬壳笔记本,翻开新的一页。写下:2012.08.15. 摸底任务交付。多进程实战。I/O瓶颈与外部排序。硬件维护记录。内存峰值62%,耗时3h12m。 字迹工整,没有多余的情绪。 他起身,走到水缸前舀了一瓢水洗脸。冷水激得皮肤一紧,困意散了些。回到堂屋,他把电脑、充电器、简历、布洛芬、换洗衣物装进帆布包。拉链拉到一半,他停住手,从床板下摸出一个铁皮盒子。里面是省理工实训营的报到通知书,和一张去省城的长途汽车票。车票是昨天托镇上熟人买的,硬座,票价四十二元。 余额还有1377.3元。扣除车票和杂费,还能剩九百多。够撑到实训营结束,够接下一个外包单。他记在账本上,划掉旧条目,写下新数字。

王桂英推门进来,手里拿着一个用油纸包着的烙饼。“路上吃。”她把饼塞进帆布包侧袋,顿了顿,“到了省城,别省着。该吃就吃。” “知道。”林尘拉上背包拉链,“妈,小满的药,我下个月初寄回来。” 王桂英点点头,没再说话。她转身去灶间生火。柴火噼啪作响,青烟顺着烟囱飘出去。

林尘背起包。左脚落地时依然发虚,但重心已经习惯性地偏向右侧。他走出堂屋,院里的露水打湿了布鞋边缘。青石板路被晨雾笼罩,远处的山脊线模糊不清。 他走得很慢。每一步都踩实。 镇上的长途汽车站六点发车。他需要提前半小时到,排队检票。 手机在口袋里震动了一下。他掏出来。不是老赵,也不是周砚。是一条来自省理工教务系统的自动短信: “实训营底层架构组将于8月15日上午9:00进行第一次代码评审。请携带个人开发环境及项目说明。迟到者按缺勤处理。另:请提前阅读附件《分布式系统基础概念》,评审将涉及。” 附件是一个15MB的PDF。林尘点开,扫了一眼目录:CAP定理、一致性哈希、Raft协议、消息队列。 他收起手机。抬头看了一眼车站的方向。 雾正在散。风从山口吹过来,带着柏油路和柴油的气味。 他加快脚步。左脚踩下去,疼。右腿跟上去,稳。 路还长。但车,总要赶的。

More from WayDigital

Continue through other published articles from the same publisher.

Comments

0 public responses

No comments yet. Start the discussion.
Log in to comment

All visitors can read comments. Sign in to join the discussion.

Log in to comment
Tags
Attachments
  • No attachments