在做项目时,需要加载40442张图片,出现内存错误:MemoryError: Unable to allocate 4.34 GiB for an array with shape (40442, 80, 60, 3) and data type float64。错误源代码:

data = np.array(data, dtype="float") / 255.0# 默认float64

记录几种查到的解决策略。

1. 低精度保存数据

  一般计算上通过numpy得到的16位浮点数。float64占用的内存是float32的两倍,是float16的4倍,比如对于CIFAR10数据集,如果采用float64来表示,需要 60000 ∗ 32 ∗ 32 ∗ 3 ∗ 8 / 1024 ∗ ∗ 3 = 1.4 G 60000*32*32*3*8/1024**3=1.4G 60000∗32∗32∗3∗8/1024∗∗3=1.4G,光把数据集调入内存就需要1.4G;如果采用float32,只需要0.7G,如果采用float16,只需要0.35G左右。占用内存的多少,会对系统运行效率有严重影响,因此数据集文件都是采用uint8来存在数据,保持文件最小。

2. 更新python为64位,更新Pandas/Numpy库为64位

  Python 32bit 最大只能使用 2G 内存。32位的Python安装的pandas和Numpy也只能是32位的,那么当内存使用超过2G时,就会自动终止内存,而 64bit python则无此限制。

  • 查看Python位数:在shell中输入python

3. 修改pycharm的运行内存

  内存使用率不高,但出现MemoryError,可能存在内存限制。

  • Help → \rightarrow →Find Action → \rightarrow →(type “VM Options”) → \rightarrow →(Click)“Edit Custom VM Options”;
  • 打开pycharm64.exe.vmoptions进行编辑;
  • 修改-Xmx750m-Xmx4096m 分配4G内存,视情况而定;
  • 保存并重启pycharm。

4. 扩充虚拟内存

具体设置:

  • 右键点击我的电脑,选择“属性
  • 在打开的面板中依次打开高级系统设置高级选项卡—性能设置高级选项卡—更改,进入虚拟内存的设置界面;
  • 自动管理所有驱动器的分页文件大小选项前的方框里的勾取消,选择一个盘符(尽量是非系统盘),选择自定义大小,将初始大小最大值尽量设置为同一数值(可以根据自己电脑的物理内存设置,如电脑物理内存是2GB,就在3GB到6GB之间选择一个数值),然后点击设置,最后点击确定并重启电脑。

物理内存与虚拟内存:
物理内存

  • 物理内存是真实存在的,它的表现形式是插在电脑主板上的内存条,看机器配置的时候,看的就是物理内存;
  • 内存条的读写速度达到2700MB/s以上;
  • 物理内存容量由内存条决定,内存条是多少GB,物理内存就是多少GB;
  • 物理内存是与CPU进行沟通的桥梁。

虚拟内存

  • 虚拟内存是虚拟存在的,其实是电脑匀出一部分硬盘空间来充当内存使用。当内存耗尽时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张;
  • 普通机械硬盘读写速度只有150MB/s,即使是固态硬盘也仅可以达到500MB/s,因而与物理内存相比虚拟内存的读写速度都非常慢;
  • 虚拟内存的容量大小可以通过设置进行改变;
  • 虚拟内存是在计算机运行程序或操作所需的物理内存不足时,起到补偿作用。

  即便你的内存已经大到“无可救药”的地步,也不应该将虚拟内存关闭,因为除了传统的为RAM“后备”这一功能外,Windows也会利用虚拟内存执行一 些特定操作。此外虚拟内存的打开还有助于提高内存命中率及保证系统稳定,个别软件(如Photoshop、3Dmark等)在运行时也会需要虚拟内存。

电脑,虚拟内存,物理内存,有什么区别。,哪个更好。| 内存管理介绍

5. 优化数据读取方式

关于 TensorFlow 读取数据的方法,官网给出了三种方法:

  • 供给数据: 在 TensorFlow 程序运行的每一步,让 Python 代码来供给数据。
  • 从文件读取数据: 在 TensorFlow 图的起始,建立一个输入管线从文件中读取数据。
  • 预加载数据: 在 TensorFlow 图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。

  用户处理输入数据的典型流程是:首先将输入数据集从文件系统种读取到内存中,然后将其转换为模型需要的输入数据格式,接着以某种方式传入数据流图,继而开始真正的模型训练过程。
  输入数据集一般被存储在各种类型的文件系统中,根据文件系统类型和输入数据集大小,有两种不同的数据读取方法:

  • 大数据集:(如 ImageNet )一般由大量数据文件构成,因为数据规模太大,所以无法一次性全部加载到内存中,因为太耗内存,这个时候最好使用 TensorFlow 提供的队列 queue ,也就是第二种方法从文件读取数据。大数据集时则多采用 TFRecords 格式。
  • 小数据集:(如 MNIST )可能仅包含一个文件,因此用户可以在模型训练开始前一次性地将其加载到内存处理,然后再分batch 输入网络进行训练,也就是第三种方法预加载数据。小数据集时多采用 minibatch

稀疏数据的存储

  在数据是稀疏的情况下,如训练集中大量one hot特征,此时把dense的数据转成sparse的存储方式可以减小内存占用,可以参考scipy里面的sparse模块,里面有多种支持sparse存储的数据结构可以直接调用。但是注意该模块的集中数据结构至少都需要dense数据2-3倍的空间来存储,也就是说,如果数组中sparse的只有一半甚至更少,那使用sparse结构只会占用更多的空间,只有在数据中大量都是稀疏的情况下才能用。

python处理大训练集过程中遇到的Memory Error问题解决

使用pandas中read_csv的块读取

  • 块读取:不会一次性把所有的数据都放到内存中来,而是分块读到内存中,最后再将块合并到一起,形成一个完整的DataFrame。
with open(path) as f:data = pd.read_csv(path, sep=',',engine = 'python',iterator=True)loop = Trueindex,chunkSize,chunks = 0,1000,[]while loop:try:print(index)chunk = data.get_chunk(chunkSize)chunks.append(chunk)index+=1except StopIteration:loop = Falseprint("Iteration is stopped.")
print('开始合并')
data = pd.concat(chunks, ignore_index= True)

read()/readline()/readlines()

  • read():一次性读取文件的全部内容,如果文件很小,一次性读取最方便;
  • read(size):每次最多读取size个字节的内容,如果不能确定文件大小,反复调用read(size)比较保险;
  • readline():每次读取一行内容;
  • readlines():一次读取所有内容并按行返回list,如果是配置文件,调用readlines()最方便:

处理大文件是很容易想到的就是将大文件分割成若干小文件处理,处理完每个小文件后释放该部分内存。

def read_in_chunks(filePath, chunk_size=1024*1024):"""Lazy function (generator) to read a file piece by piece.Default chunk size: 1MYou can set your own chunk size """with open(filePath) as file_object:while True:chunk_data = file_object.read(chunk_size)if not chunk_data:breakyield chunk_data
if __name__ == "__main__":filePath = './path/filename'for chunk in read_in_chunks(filePath):process(chunk) # <do something with chunk>

HDF5文件

批量读写HDF5文件:Python处理HDF5文件:h5py库

TFRecords 格式

TFRecords 格式和 h5py 格式是类似的效用。

TensorFlow学习笔记之30分钟学会 TFRecords 格式高效处理数据
tensorflow TFRecords文件的生成和读取方法

6. 手动回收变量(Python)

  Python的垃圾回收机制比较懒惰,有时候在一个for循环中的变量用完不会回收,下次重新初始化的时候又重新开辟了空间,这时候可以手动del这个变量,del x,然后import gc, 然后手动gc.collect()


Python学习:numpy库 数据量太大出现Memory Error问题的解决方法汇总
win10 pycharm 出现MemoryError 和 Unable to allocate array with shape

MemoryError的处理方式相关推荐

  1. python怎么读文件后删去空格以行为单位进行排序-python 大文件以行为单位读取方式比对...

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

  2. python读取文件_python这么受欢迎,你知道如何以正确的方式来读取文件内容吗

    前言 对于互联网的开发人员来说,读取写入文件几乎是代码中常见的一种操作.但是经常性的打开关闭文件,浪费资源不说,当文件大的时候读取的效率也不高.所以今天我们一起看一个便捷的模块linecache.li ...

  3. pickle.dump()把大量数据写入文件发生MemoryError解决方法

    跑了12个小时的代码,最后因为pickle.dump()发生MemoryError错误,实在头疼.pickle.dump()有个bug就是不能存储大量数据,所以只能用别的方法,我用的是joblib读写 ...

  4. python读取大文件的某行_python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

  5. python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. http://stackoverflow.com/questions/800 ...

  6. 解决memoryerror

    pycharm跑代码的时候,读取数据过程中出现memoryerror 看了其他人的原因: 1.虚拟内存太小, 2.用了32位python 3.换一种读取数据的方式 1和2我都检查过了,虚拟内存够用,p ...

  7. Python Django实现MySQL百万、千万级的数据量下载:解决memoryerror、nginx time out

    前文   在用Django写项目的时候时常需要提供文件下载的功能,而Django也是贴心提供了几种方法:FileResponse.StreamingHttpResponse.HttpResponse, ...

  8. python memoryerror解决办法_解决python报错MemoryError的问题

    解决python报错MemoryError的问题 如下: python 32bit 最大只能使用 2G 内存,坑爹之处,超过 2G 报错MemoryError. 而 64bit python则无此限制 ...

  9. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

最新文章

  1. 蚂蚁集团研究员王益:Go+ 可有效补全 Python 的不足
  2. 潘在亮:给业务开发提供黑科技装备的“测试Q博士”(图灵访谈)
  3. boost::convert模块实现默认转换器fail失败的测试程序
  4. mysql binlog 备份恢复数据_Mysql结合备份+binlog恢复误删除操作数据
  5. 【BZOJ2229】【ZJOI2011】最小割
  6. Java常用类:String
  7. 第一章python绝对温标身体质量指数bmi
  8. c++和java哪个好学_【技术科普】C语言和java语言有些什么区别?
  9. 根据表格长度使td里的内容换行
  10. B VUE系列 七:vue的脚手架项目是用webpack构建的本地服务环境,如何在手机上访问?...
  11. 设计模式学习之外观模式
  12. linux自带的cpu监测工具,Linux CPU实时系统监控工具mpstat
  13. [JNI] 开发基础(4)函数指针及指针函数
  14. 超详细Java安装教程,小白速来!!!
  15. CAD绘图设计效率慢?这些外挂神器帮你1小时完成3小时的工作!
  16. 使用 stm32实现锂电充电_12V锂电池保护板电路图锂电池保护板工作原理及短路、过充电等控制原理分析...
  17. python窗口显示表格_python窗体表格
  18. 系统架构设计——OpenHarmony 鸿蒙分布式操作系统
  19. svn的图标突然不显示了
  20. 直播系统 java_直播系统软件定制开发

热门文章

  1. 医院自助机和分诊那个php,一种医院分诊用自助查询分诊机的制作方法
  2. Android DownloadManager的用法
  3. STM32CubeMX | STM32使用HAL库进行脉冲宽度和周期测量
  4. Java、计算平均值和标准方差
  5. 深度神经网络——LSTM作曲机的实现
  6. JS相等(==)和全等(===)区别
  7. react 简单的表格导出
  8. 23种设计模式-完结!
  9. 租赁小程序|人车网租赁系统|电动车租赁系统包含哪些功能?
  10. jvm如何实现隐藏_反映一个隐藏的jvm超级大国