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

MemoryError内存分配失败求助:无法分配2.24 MiB float32数组

Jupyter Notebook执行model.fit触发MemoryError问题

问题场景

执行以下model.fit代码时触发MemoryError:

history = model.fit(tuple(train_generator), steps_per_epoch=num_train_examples//batch_size, epochs=500, callbacks=callbacks,
                   validation_data=tuple(eval_generator), validation_steps=num_eval_examples//batch_size, verbose=1)

错误详情

错误提示:无法为形状(12, 64, 255, 3)、数据类型float32的数组分配2.24 MiB内存,出错代码位于Generator.py第335行:

--> 335 batch_x[0] = batch_x[0][idx]

相关数据处理代码片段

Generator.py中引发问题的核心数据处理逻辑:

batch_y = self.y[list(sorted(used_indexes))]
        idx = []
        for i in range(0, len(is_horiz_flipped), 1):
            if batch_y.shape[1] == 1:
                if (is_horiz_flipped[i]):
                    batch_y[i] *= -1
                    
                if (np.isclose(batch_y[i], 0)):
                    if (np.random.uniform(low=0, high=1) > self.zero_drop_percentage):
                        idx.append(True)
                    else:
                        idx.append(False)
                else:
                    idx.append(True)
            else:
                if (batch_y[i][int(len(batch_y[i])/2)] == 1):
                    if (np.random.uniform(low=0, high=1) > self.zero_drop_percentage):
                        idx.append(True)
                    else:
                        idx.append(False)
                else:
                    idx.append(True)
                
                if (is_horiz_flipped[i]):
                    batch_y[i] = batch_y[i][::-1]

        batch_y = batch_y[idx]
        batch_x[0] = batch_x[0][idx]
        batch_x[1] = batch_x[1][idx]
        
        return batch_x, batch_y

已尝试无效操作

将Windows分页文件最大值调整至约80GB,问题仍未解决。

可行解决思路

  • 优化索引赋值逻辑:batch_x[0] = batch_x[0][idx]这类切片赋值会创建临时数组,可改为提前计算有效样本数量,直接创建对应大小的数组后批量赋值,避免临时内存占用。
  • 调小batch_size:单次处理的数据量过大可能导致累计内存溢出,降低batch_size减少单次加载的数据量。
  • 移除生成器的tuple转换:tuple(train_generator)会一次性读取生成器所有数据,直接将生成器传入model.fit即可,无需转成元组。
  • 将idx转为NumPy布尔数组:把Python列表类型的idx改成NumPy布尔数组,NumPy索引操作的内存效率更高,减少额外开销。
  • 检查生成器内存泄漏:在生成器迭代完成后,用del删除不再需要的变量(如旧的batch数据),避免内存累积。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:56:02