Python 生成器与 yield:处理大文件不爆内存
📅 2026/7/13 11:23:12
👁️ 次浏览
Python 生成器与 yield:处理大文件不爆内存处理一个几 GB 的日志文件,新手常写data f.readlines()或content f.read(),然后程序直接MemoryError崩了,或者机器卡到风扇狂转。原因很简单:这两种写法都把整个文件一次性塞进内存。Python 的生成器(generator)就是解决这类问题的利器——它让你「用多少读多少」,内存占用和文件大小几乎无关。这篇从大文件读取这个具体痛点讲起,把yield和生成器讲透。问题:一次性读取直接爆内存# 反例:2GB 文件直接把内存打满defcount_errors(path):withopen(path)asf:linesf.readlines()# 整个文件读进 list,2GB 文件就吃 2GB 内存returnsum(1forlineinlinesifERRORinline)readlines()返回一个包含所有行的列表,文件多大内存就吃多大。同理f.read()把整个内容读成一个字符串,一样爆。生成器基础:yield 到底做了什么普通函数用return一次性返回结果就结束了。带yield的函数叫生成器函数,调用它不会立即执行,而是返回一个生成器对象;每次向它要一个值(next()或for迭代),函数才执行到下一个yield,吐出一个值后暂停,保留全部局部状态,下次接着往下跑。defcounter(n):print(开始)foriinrange(n):yieldi# 吐出 i,然后暂停在这里print(结束)gencounter(3)# 此时函数体一行都没执行print(next(gen))# 打印「开始」,再打印 0print(next(gen))# 打印 1(从上次暂停处继续)print(next(gen))# 打印 2# print(next(gen)) # 再要会打印「结束」并抛 StopIteration关键点:生成器是「惰性」的,值是按需生产的,任何时刻内存里只有一个值,不是全部值。这正是它省内存的原因。用生成器逐行处理大文件其实 Python 的文件对象本身就是生成器——直接for line in f就是逐行惰性读取,根本不用readlines():defcount_errors(path):withopen(path)asf:# for line in f 逐行读,内存里始终只有当前一行returnsum(1forlineinfifERRORinline)这个版本处理 2GB 还是 200GB,内存占用都是常数级(一行的大小)。如果读的不是按行分隔,而是要按固定大小分块(比如二进制文件),自己写个生成器:defread_chunks(path,chunk_size1024*1024):按 1MB 分块惰性读取,适合大二进制文件withopen(path,rb)asf:whileTrue:chunkf.read(chunk_size)ifnotchunk:# 读到文件末尾breakyieldchunk# 吐出一块,暂停,等下次要# 用法:算一个大文件的 MD5,内存只占 1MBimporthashlibdeffile_md5(path):hhashlib.md5()forchunkinread_chunks(path):h.update(chunk)returnh.hexdigest()进阶:生成器管道,像流水线一样处理数据生成器真正强大的地方,是能串成管道——每一级只处理一条数据就传给下一级,全程不落地成大列表。这和 Unix 的cat | grep | awk是一个思路。defread_lines(path):withopen(path)asf:forlineinf:yieldline.rstrip(\n)defonly_errors(lines):forlineinlines:ifERRORinline:yieldlinedefextract_ip(lines):forlineinlines:# 假设每行以「IP 空格」开头yieldline.split( ,1)[0]# 把三级串起来:数据一条条流过,内存始终只有一行pipelineextract_ip(only_errors(read_lines(app.log)))foripinpipeline:print(ip)注意:整个pipeline在for循环真正迭代之前,一行都没读。这就是惰性求值的威力——你搭好流水线,数据才在你要的时候一条条流过。一个容易踩的坑:生成器只能消费一次生成器是一次性的,迭代完就空了,再迭代什么都没有:gen(x*xforxinrange(3))# 生成器表达式print(list(gen))# [0, 1, 4]print(list(gen))# [] - 已经耗尽,不会报错但为空如果你需要多次遍历,要么每次重新创建生成器,要么老老实实用list存下来(但那就放弃了省内存的好处,权衡清楚)。另外,别对生成器用len()——它不知道自己有多少个元素,会直接TypeError。顺带一提,上面(x * x for x in range(3))这种生成器表达式(圆括号)和列表推导(方括号[...])长得像,但一个惰性省内存、一个立即算出整个列表。处理大数据时优先用圆括号版本。小结大文件别用f.read()/f.readlines(),会一次性吃满内存。yield让函数变成生成器:惰性、按需生产,任意时刻内存里只有一个值。逐行读直接for line in f;按块读自己写while f.read(size) yield的生成器。生成器可以串成管道,数据像流水线一样一条条流过,全程不落地,直到真正迭代才开始读。坑:生成器只能消费一次,耗尽后为空;不能对它用len();需要多次遍历就重建或转 list。一句话记忆:return是「一次给完」,yield是「要一个给一个」——处理大数据时,惰性才是省内存的关键。
5个步骤彻底解决Windows AirPods连接问题:AirPodsDesktop完全指南 【免费下载链接】AirPodsDesktop ☄️ AirPods desktop user experience enhancement program, for Windows and Linux (WIP) 项目地址: https://gitcode.com/gh_mirrors/ai/AirPodsDesktop
…
📅 2026/7/13 11:23:12
第一次在本地环境运行 PyTorch 深度学习项目时,很多人会陷入一个误区:以为只要安装了 PyTorch 和 CUDA,代码就能自动在 GPU 上飞起来。但实际情况往往是,你看着代码在 CPU 上缓慢执行,而 GPU 使用率始终显示 0%。这种&…
📅 2026/7/13 11:22:12
1. 百度OCR私有化部署的核心价值 企业选择私有化部署百度OCR通常出于三个核心诉求: 数据不出内网 、 性能可定制化 、 特殊场景适配 。与公有云API调用相比,私有化部署将算法模型部署在企业本地服务器,所有数据处理都在内网完成&#x…
📅 2026/7/13 11:22:12
PyInstaller 6.8.0 打包 PySide6 6.7.0 程序:3步解决 shiboken6.dll 缺失报错 最近在将一个基于 PySide6 6.7.0 开发的 Python GUI 程序打包成 exe 时,遇到了一个令人头疼的问题:程序运行时提示找不到 shiboken6.abi3.dll 文件。经过一番摸索…
📅 2026/7/13 12:06:28
摘要
FIDO2 Passkey 无密码认证本用于抵御传统账号钓鱼,却被黑灰产结合语音钓鱼(Vishing)形成新型复合攻击。以 2026 年 4–7 月 Okta 预警的 O-UNC-066(Pink 组织)针对 Microsoft 365 语音钓鱼事件为实证样本…
📅 2026/7/13 12:06:28
1. GEO技术体系与AI时代的融合价值GEO(地理空间信息技术)正在经历从传统GIS系统向智能化空间计算的转型。这个领域不再局限于简单的地图展示和空间分析,而是通过与AI技术的深度融合,形成了包括空间数据智能采集、实时地理围栏分析…
📅 2026/7/13 12:06:28
5大核心功能深度解析:B站视频下载器如何解锁大会员4K和充电专属内容 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader
还在为…
📅 2026/7/13 12:06:28
3分钟掌握免费文档下载神器:kill-doc全攻略 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的烦恼…
📅 2026/7/13 12:06:28
Visual Studio 2015 Update 3 安装受阻排查指南:从"Setup Blocked"到完美运行 1. 问题背景与典型场景 当开发者尝试在Windows系统上安装Visual Studio 2015 Update 3时,经常会遇到令人头疼的"Setup Blocked"错误提示。这个问题的核…
📅 2026/7/13 12:05:28
做技术的人都知道,环境配置是最让人头秃的环节。特别是当你面对一个相对小众或者刚起步的项目时,文档可能不全,社区可能冷清。这时候,找到靠谱的来源就显得尤为重要。今天咱们不聊虚的,就聊聊怎么稳妥地完成 openclaw安装官方 流程,顺便分享几个我踩过的坑,希望能帮你省…
📅 2026/7/13 0:01:22
1. 项目概述:当火焰特效成为帧率杀手在UE5项目里,尤其是那些追求电影级视觉的开放世界或者大场景战斗游戏,一个熊熊燃烧的篝火、一次震撼的爆炸,往往是点燃玩家情绪的关键。Niagara作为虚幻引擎5中取代了老旧的Cascade的下一代粒子…
📅 2026/7/13 0:01:52
1. 项目概述与核心价值 最近在对接抖音小游戏平台时,侧边栏复访功能成了一个绕不开的“必答题”。很多开发者朋友,包括我自己一开始,都对这个功能有点摸不着头脑:它到底是什么?为什么平台这么重视?不接入行…
📅 2026/7/13 0:01:52
豆包openclaw最近圈子里都在聊豆包openclaw,我也没忍住,掏腰包入手了一套。说实话,刚拿到手的时候,心里是打鼓的。毕竟市面上类似的智能硬件太多了,有的吹得天花乱坠,用起来却是一堆bug。为了不让大家的钱打水漂,我连续用了半个月。从开箱到日常高频使用,甚至故意测试它…
📅 2026/7/13 5:30:27
SQLyog 13.3.1 社区版在Windows 10/11上的完整安装与连接指南 对于刚接触MySQL数据库管理的开发者和学生来说,选择一个直观易用的图形化管理工具至关重要。SQLyog作为一款轻量级但功能强大的MySQL GUI工具,能够显著提升数据库操作的效率和体验。本文将详…
📅 2026/7/13 6:21:22
SPEC CPU 2006 跨平台基准测试深度实战:ARM/X86/MIPS 架构配置优化与结果分析方法论在当今多元化的计算架构时代,如何客观评估不同处理器平台的真实性能成为系统工程师和性能优化专家的核心挑战。SPEC CPU 2006 作为业界公认的计算密集型基准测试套件&am…
📅 2026/7/13 7:10:30
目录
第一步:选对模板,省心一半
第二步:打开扫码点餐功能
开启功能按钮
桌台管理与桌码生成
第三步:个性化设计,打造品牌感
调整点餐页面
设置点餐规则 你还在让顾客站着排队点餐吗?2025年ÿ…
📅 2026/7/13 3:29:47
在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…
📅 2026/7/12 15:39:57
FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE
你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…
📅 2026/7/13 9:07:16