Ubuntu中曾正常运行的Python脚本自动终止问题求助
问题排查与解决方案
一、排查并恢复分页(交换空间)
检查交换空间状态
- 查看当前启用的交换空间:
无输出则表示交换空间未启用;也可以通过swapon --showcat /proc/swaps查看,若结果为空则确认未启用。 - 查找系统中存在的swap分区/文件:
- 找swap分区:
lsblk,查看TYPE为swap的条目 - 找swap文件:
find / -name "swapfile"
- 找swap分区:
恢复已存在的交换空间
- 若为swap分区,启用并设置开机自动挂载:
编辑sudo swapon /dev/sdXn # 替换为你的swap分区路径,比如/dev/sda3/etc/fstab,确保存在以下行(无则添加):/dev/sdXn none swap sw 0 0 - 若为swap文件,启用并设置开机自动挂载:
编辑sudo swapon /swapfile/etc/fstab,确保存在以下行(无则添加):/swapfile none swap sw 0 0
新建交换空间(若原本无swap)
# 创建16G大小的swap文件(可根据需求调整,比如8G/32G) sudo fallocate -l 16G /swapfile # 设置权限防止其他用户访问 sudo chmod 600 /swapfile # 格式化为swap格式 sudo mkswap /swapfile # 启用swap sudo swapon /swapfile # 添加到fstab,开机自动挂载 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
二、脚本层面内存优化(根治内存耗尽问题)
既然Windows原本就触发内存错误,Ubuntu更新后也扛不住,说明脚本内存占用过高,需从逻辑上优化:
- 分批处理数据:避免一次性加载所有文本到内存,改用生成器逐批读取、处理,每批处理完成后释放内存。
- 优化词袋生成参数:
- 使用
sklearn.feature_extraction.text.CountVectorizer时,设置max_features=N(比如N=10000),只保留高频词汇,减少特征维度。 - 限制
ngram_range范围,比如从(1,3)改为(1,2),降低特征数量。 - 改用
HashingVectorizer替代CountVectorizer:无需存储完整词汇表,内存占用极低,适合大规模文本数据。
- 使用
- 定位并修复内存泄漏:安装
memory-profiler排查内存热点:
在循环关键节点手动调用pip install memory-profiler python -m memory_profiler your_script.pygc.collect()强制回收内存。 - 使用高效数据结构:用NumPy数组替代Python列表存储词袋矩阵,大幅降低内存开销。
三、系统层面辅助调整
- 调整OOM Killer行为:编辑
/etc/sysctl.conf,添加:
执行vm.overcommit_memory=1sudo sysctl -p生效,该参数允许系统超额分配内存,降低脚本被直接杀掉的概率。 - 释放系统内存:关闭闲置的浏览器标签、后台服务、IDE插件,用
htop查看高内存进程并终止。
附:Windows下MemoryError处理建议
- 启用64位Python:32位Python内存上限约2GB,切换为64位版本可突破此限制。
- 调整虚拟内存:右键「此电脑」→「属性」→「高级系统设置」→「性能」→「设置」→「高级」→「虚拟内存」,勾选「自动管理所有驱动器的分页文件大小」,或手动设置更大的分页文件(如32GB)。
内容的提问来源于stack exchange,提问作者Zaf
相关产品推荐
相关产品推荐

