np.ones内存占用不符预期:7.2GB理论值为何仅显示5.3GB?
问题原因解析
1. 初始np.ones内存低于理论值:写时复制(COW)与Windows内存管理
理论上30011×30011的float64数组需占用约7.2GB,但Windows任务管理器显示的是进程实际使用的物理内存(工作集),而非分配的虚拟内存地址空间:
- 当
np.ones创建全1数组时,操作系统会利用写时复制优化:所有值相同的内存页会被共享,仅在数组元素被修改时才会为每个页分配独立物理内存。因此实际物理内存占用远小于理论值,仅需存储少量共享页即可。 - 任务管理器的统计包含进程内其他小对象,但核心原因是COW机制大幅减少了物理内存的实际占用。
2. x=x*3.14后内存进一步下降:旧数组回收与新数组的COW优化
执行x=x*3.14时,Python会创建一个元素全为3.14的新float64数组,同时原数组失去引用:
- 原数组的内存会被Python的垃圾回收器标记为可回收,操作系统随即释放其占用的物理内存页。
- 新数组因元素值完全相同,同样触发操作系统的写时复制优化,仅占用少量共享物理页,因此物理内存占用进一步降低。
3. 数分钟后内存降至1.7GB:延迟垃圾回收与Windows内存压缩/页交换
- Python的垃圾回收并非实时执行,原数组和中间计算产生的临时对象可能在数分钟后才被彻底回收,释放剩余的物理内存。
- Windows系统会主动对闲置内存页进行内存压缩,或把不常用的页交换到虚拟内存(页面文件)中,进一步降低进程的物理内存占用(工作集)。
内容的提问来源于stack exchange,提问作者user2153235
相关产品推荐
相关产品推荐

