应采用流式写入避免内存溢出:逐块write(chunk),每块≤8192字节;用csv.writer、json.dump等直接写入文件对象;禁用一次性拼接字符串,如''.join()或str(large_list)。

直接写入大文件时调用 .write(data) 且 data 是一个超大字符串或 bytes 对象,必然导致内存溢出 —— 因为整个内容必须先在内存中拼好,再一次性刷入磁盘。
避免一次性构造完整数据再 write
常见错误是把所有内容先拼成一个 giant string:all_content = ''.join(lines) 或 b''.join(chunks),再 f.write(all_content)。哪怕只是 500MB 的文本,Python 就会申请一块连续内存来存放它,而 GC 不会立刻回收,尤其当该对象被日志、异常 traceback 或闭包隐式引用时。
- 改用流式写入:打开文件后,逐块
.write(chunk),每块控制在 8192 字节以内 - 若数据来自生成器或迭代器(如数据库游标、CSV reader),直接
for row in data_source: f.write(format_row(row)) - 禁用
buffering=0(仅限二进制模式),但更推荐保持默认行缓冲或指定buffering=8192,让 OS 层管理写入节奏
用 contextlib.nullcontext 避免意外缓存
有时你以为在“流式写”,实际却被中间层缓存了。比如用 io.StringIO() 收集内容再 .getvalue(),或用 json.dumps(obj, indent=2) 格式化大结构体 —— 这些都会构造完整字符串。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 对 JSON 场景,改用
json.dump(obj, f)直接写入文件对象,不经过内存字符串 - 写 CSV 时,始终用
csv.writer(f)+.writerow(),而非自己拼','.join(...) - 若必须用 StringIO 做中间处理,处理完立即
del buffer,并确认无其他变量引用其.getvalue()返回值
注意 open() 的 mode 和 buffering 组合陷阱
open(path, 'w', buffering=1) 在文本模式下启用行缓冲,看似安全,但若某一行本身超长(如单行几 MB 的 base64),仍会触发大内存分配;而 buffering=0 又只允许二进制模式,且频繁系统调用拖慢性能。
- 最稳组合:
open(path, 'wb', buffering=8192)(二进制 + 显式缓冲区大小) - 文本写入优先选
encoding='utf-8'并配合newline=''避免换行符重复编码开销 - 绝对不要用
open(...).write(str(large_list))——str()会强制展开整个结构体,生成巨量临时字符串
真正危险的不是“写得慢”,而是“写之前就崩了”。只要数据源可迭代、目标文件可流式接收,就永远绕过“拼完整再写”这一步 —— 这是最容易被忽略,也最常引发 OOM 的环节。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










