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
相关产品推荐
相关产品推荐

