MemoryError的处理方式

Bug:MemoryError: Unable to allocate 4.34 GiB for an array with shape (40442, 80, 60, 3) and data type float64

记录几种查到的解决策略:
1. 低精度保存数据
一般计算上通过numpy得到的16位浮点数。float64占用的内存是float32的两倍,是float16的4倍,比如对于CIFAR10数据集,如果采用float64来表示,需要60000323238/1024**3=1.4G60000∗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 = True
index,chunkSize,chunks = 0,1000,[]
while loop:
try:
print(index)
chunk = data.get_chunk(chunkSize)
chunks.append(chunk)
index+=1
except StopIteration:
loop = False
print(“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: 1M
You 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:
break
yield chunk_data
if name == “main”:
filePath = ‘./path/filename’
for chunk in read_in_chunks(filePath):
process(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

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中的MemoryError错误通常表示程序尝试使用超过可用内存的数据量。为了解决这个问题,有以下一些建议: 1. 优化代码:检查代码中是否存在不必要的数据结构或不必要的变量,尽量减少程序占用的内存量。 2. 增加可用内存:可以尝试升级硬件(例如增加内存),或者使用其他机器具有更多内存。 3. 减少数据量:可以通过增加程序中的批处理大小,减小数据规模,或使用增量计算的方式来减少单次处理的数据量。 4. 使用生成器或迭代器:使用生成器或迭代器可以在程序运行时节省内存,因为它们不会一次性加载所有数据。 5. 使用内存映射文件:内存映射文件可以将大型文件映射到虚拟内存中,从而减少程序所需的内存量。 6. 使用第三方库:有一些专门针对内存优化的第三方库,例如numpy、pandas等,可以尝试使用它们来优化程序的内存占用。 ### 回答2: Python中的MemoryError是一种由于内存不足而引起的错误,通常是由于程序中存在过多的内存占用或者是程序实现问题引起的。 对于Python MemoryError,有以下几种解决方法: 1. 使用生成器而非列表: 使用生成器可以大大减少程序中对于内存的需求。例如,如果需要遍历一个极大的数据集,使用生成器可以逐个返回每个数据点,而不需要一次性将所有数据点存储到内存里。 2. 使用迭代器而非列表: 与生成器类似,使用迭代器可以逐个处理数据点而不需要一次性将其全部读入内存。 3. 使用numpy数组存储数据: numpy提供了一种高效的方式来存储和处理大量数据。 4. 增加内存: 如果以上方法无法满足需求,可以增加计算机的物理内存。 5. 删除不需要的对象: 程序在执行过程中,会有许多不必要的对象被存储在内存中,如果及时删除这些对象,可以释放更多的内存空间。 6. 减少冗余: 在程序设计时,应避免出现冗余,尽量减少内存占用。比如,应避免存储重复的数据、重复计算等情况。 总之,针对Python MemoryError,有很多解决方法,可以根据实际情况选择适合自己的方法。同时,在程序开发中应注意减少内存占用,避免出现内存不足的情况。 ### 回答3: Python是一个高级编程语言,它受到了开发人员的欢迎,但是在处理大量数据时,会遇到Python MemoryError的问题,这个问题指的是python程序在执行期间无法分配足够的内存空间,导致程序崩溃。如果您遇到了Python MemoryError的问题,以下是一些解决办法: 1. 优化代码:如果您的代码超过了计算机的容量,那么您需要优化您的代码。优化代码包括使用生成器代替列表,使用迭代代替递归,使用离线模型训练等。 2. 减少内存使用:检查您的代码中是否有无用的变量、未关闭的文件句柄等。同时,还可以使用python内置的gc模块强制开启垃圾回收机制,以减少内存使用。 3. 增加可用内存:如果您的计算机配置足够好,可以增加计算机的物理内存或交换空间。同时,您还可以使用虚拟机或者docker容器等技术,将Python程序运行在其他的机器上。 4. 使用数据存储文件:如果您的数据量非常大,可以将数据存储在数据库或者文件中,而不是将所有数据读入内存。 5. 使用外部库:Python本身无法处理大数据集,但是您可以使用外部库,如Pandas、Dask等,来处理大数据集。这些库可以将数据分块,并使用延迟计算等技术来缓解Python MemoryError的问题。 总之,Python MemoryError是一个常见的问题,但是有很多解决办法。您可以优化代码、减少内存使用、增加可用内存、使用数据存储文件或者使用外部库来缓解Python MemoryError的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值