You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

multiprocessing.Array内存分配机制疑问:为何可分配超过物理RAM容量的数组?

multiprocessing.Array内存分配相关问题解答

核心底层逻辑说明

  • 内存超售与延迟分配机制
    Linux系统默认开启内存超售(Overcommit)策略,你调用接口申请内存时,内核只会给你分配虚拟地址空间,不会直接预留物理RAM。只有当你真正读写某一段内存地址时,内核才会通过缺页中断给对应地址分配物理内存页。只要你没有实际写入超过物理内存容量的数据,就算申请的虚拟内存远大于物理RAM,也可以创建成功、不会触发swap,这就是你能创建大于32GB数组的核心原因。
  • 共享内存的统计逻辑
    multiprocessing.Array默认基于/dev/shm下的tmpfs文件实现,tmpfs是完全跑在内存中的文件系统,它占用的空间系统会统一统计到buff/cache(也就是htop里的黄色缓存区域)。htop里的绿色已用内存是进程的常驻内存(RSS),统计的是当前进程实际访问过、已经映射到进程地址空间的物理页大小。
    你创建小容量数组时绿色内存同步上涨,是因为小内存块申请后内核会做预分配,加上你后续访问了数组元素,对应的物理页被计入进程RSS;创建20GB这类大容量数组时,内核不会做预分配,你只访问了数组最后一个元素,只有这1个4KB/16KB的内存页被映射计入RSS,剩下的区域只占虚拟地址空间,所以绿色内存几乎无变化,整体申请的共享内存容量统计在黄色缓存区域。
  • 访问速度无差异的原因
    tmpfs的所有数据本身就存储在物理内存中,htop里的黄色缓存只是统计分类,和读写磁盘用的磁盘缓存不是一回事。只要是已经分配了物理页的内存,不管统计在RSS还是缓存分类下,访问速度都是物理内存的读写速度,完全没有性能差异。

实际场景使用建议

你在8GB内存设备上用作摄像头缓冲区时,只要6个共享内存数组的实际写入总数据量不超过设备的可用物理内存(扣除系统、其他进程占用后一般剩余6-7GB),就算部分内存统计在缓存区域也不会有任何性能问题。只有当实际写入的数据量超过可用物理内存时,才会触发OOM杀进程或者swap写入,才会影响运行稳定性和性能。

内容的提问来源于stack exchange,提问作者Ardemion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:15:00