You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Colab会话因内存占用过高崩溃:创建大3D numpy数组报错咨询

为什么创建大型NumPy数组时25GB内存仍会崩溃?

咱们先算笔明白账——你写的这行代码要创建的数组,实际需要的内存远远超过了你可用的25GB,这就是崩溃的根本原因:

  • 先精确计算内存需求
    你的数组是(30000, 23, 20000)float32类型,每个float32元素占用4字节。咱们算一下总内存:

    total_elements = 30000 * 23 * 20000  # 13,800,000,000 个元素
    total_bytes = total_elements * 4     # 55,200,000,000 字节
    total_gb = total_bytes / (1024**3)   # 约 51.4 GB
    

    看到没?这个数组本身就需要超过50GB的内存,你的25GB可用空间连一半都不够,自然会因为内存耗尽崩溃。

  • 还有这些隐形的内存开销
    就算你刚好凑够理论上的51.4GB,实际运行时也可能出问题:

    • NumPy数组除了存储数据,还需要额外内存存储元数据(比如形状、数据类型、步长等);
    • 系统内存对齐要求:为了提升访问效率,内存分配会按特定粒度对齐,这也会占用少量额外空间;
    • 你的电脑上还有其他进程(比如浏览器、IDE、后台服务)在占用内存,实际可用的物理内存比25GB还要少。
  • 连续内存块的限制
    NumPy的数组是连续存储的,系统必须给你分配一块完整的、连续的50GB+内存空间。就算总可用内存够,但如果内存已经碎片化,没有这么大的连续空闲块,分配也会失败。

几个可行的解决方案

既然知道了问题所在,你可以试试这些办法:

  • 换用更紧凑的数据类型:如果你的场景不需要float32的精度,改成float16(每个元素2字节,内存需求减半到约25.7GB,刚好接近你的可用内存),或者根据数据范围用uint8等更小的类型;
  • 分块处理数据:不要一次性创建整个大数组,而是分批次生成、处理数据,用完就释放对应内存;
  • 使用内存映射文件:用np.memmap把数组存储在磁盘上,只把当前需要操作的部分加载到内存,大幅降低物理内存占用;
  • 改用稀疏数组:你的数组是one-hot编码,大部分元素都是0,用scipy.sparse的稀疏矩阵存储,只记录非零元素的位置,内存占用会骤减。

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

火山引擎 最新活动