解决numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array

简介: 但实际上它保存的不是模型文件,而是参数文件文件。在模型文件中,存储完整的模型,而在状态文件中,仅存储参数。因此,collections.OrderedDict只是模型的值。

报错


numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array with shape (370, 370) and data type float64


原因


最主要的还是电脑内存不足,因为需要处理的数据量太大,GPU性能不够,存在内存溢出现象


但实际上它保存的不是模型文件,而是参数文件文件。在模型文件中,存储完整的模型,而在状态文件中,仅存储参数。因此,collections.OrderedDict只是模型的值。


解决方案


1.修改float精度


在代码中我使用的是flaot 64 类型。但是实际上未必需要这么大的精度,这时候可以使用numpy中的float32, float16等,这样可以降低很多的内存需求。


2. python库、Pandas和Numpy库更新为64位


ython原始的数据类型是32位,但是最大只能使用 2G 内存,超过 2G 报错MemoryError。


如果你的Python用的是32位的,那么你的pandas和Numpy也只能是32位的,那么当你的内存使用超过2G时,就会自动终止内存。而 64bit python则无此限制,所以建议使用 64bit python。


解决方法就是:检查自己安装的python是多少位的,CMD输入python,如果是32位,那么就重装64位的Python。


如果你的python本来安装的就是64位的,可以采用下面的方法!


3. 扩充虚拟内存


在运行代码的过程中发现,内存其实只用到了一半不到,但是为什么会出现Memory的错误呢?


进过百度发现说是内存被限制了,所以考虑采用扩大虚拟内存的方法。


扩大虚拟内存的方法:

1.打开 控制面板;


2.点击 系统 这一项;


3.点击 高级系统设置 这一项;


4.点击 性能 模块的 设置 按钮;


5.选择高级面板,点击更改 虚拟内存 模块;


6.记得 不要选中“自动管理所有驱动器的分页文件大小”,然后选择一个驱动器,也就是一个盘,选中自定义大小,手动输入初始大小和最大值,但是不要太大!


7.都设置好之后,记得点击 “设置”, 然后再确定,否则无效,最后 重启电脑 就可以了。


4. 更改Python读取大文件的方法


出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,这里将介绍这两种读取方法。


Preliminary


我们谈到“文本处理”时,我们通常是指处理的内容。Python 将文本文件的内容读入可以操作的字符串变量非常容易。文件对象提供了三个“读”方法: .read()、.readline() 和 .readlines()。每种方法可以接受一个变量以限制每次读取的数据量,但它们通常不使用变量。 .read() 每次读取整个文件,它通常用于将文件内容放到一个字符串变量中。然而 .read() 生成文件内容最直接的字符串表示,但对于连续的面向行的处理,它却是不必要的,并且如果文件大于可用内存,则不可能实现这种处理。下面是read()方法示例:


try:
    f = open('/path/to/file', 'r')
    print f.read()
finally:
    if f:
        f.close()


调用read()会一次性读取文件的全部内容,如果文件有10G,内存就爆了,所以,要保险起见,可以反复调用read(size)方法,每次最多读取size个字节的内容。另外,调用readline()可以每次读取一行内容,调用readlines()一次读取所有内容并按行返回list。因此,要根据需要决定怎么调用。


 如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:


for line in f.readlines():
    process(line) # <do something with line>


Read In Chunks


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


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 
    """
    file_object = open(filePath)
    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) # <do something with chunk>


Using with open()


with语句打开和关闭文件,包括抛出一个内部块异常。for line in f文件对象f视为一个迭代器,会自动的采用缓冲IO和内存管理,所以你不必担心大文件。


#If the file is line based
with open(...) as f:
    for line in f:
        process(line) # <do something with line>


目录
相关文章
|
数据处理 Python
AttributeError: module ‘numpy‘ has no attribute ‘array‘解决办法
AttributeError: module ‘numpy‘ has no attribute ‘array‘解决办法
848 0
|
2月前
|
Python
Numpy学习笔记(一):array()、range()、arange()用法
这篇文章是关于NumPy库中array()、range()和arange()函数的用法和区别的介绍。
60 6
Numpy学习笔记(一):array()、range()、arange()用法
|
Python
numpy重新学习系列(9)---如何用np.empty_like创建一个新的和原来array形状一样的,但是未初始化的array
numpy重新学习系列(9)---如何用np.empty_like创建一个新的和原来array形状一样的,但是未初始化的array
125 0
numpy重新学习系列(9)---如何用np.empty_like创建一个新的和原来array形状一样的,但是未初始化的array
|
Python
numpy重新学习系列(8)---如何用np.empty创建一个未初始化的array
numpy重新学习系列(8)---如何用np.empty创建一个未初始化的array
82 0
numpy重新学习系列(8)---如何用np.empty创建一个未初始化的array
|
Python
numpy重新学习系列(7)---如何用np.ones_like创建一个新的和原来array形状一样的,但是元素为1的新的array
numpy重新学习系列(7)---如何用np.ones_like创建一个新的和原来array形状一样的,但是元素为1的新的array
115 0
numpy重新学习系列(7)---如何用np.ones_like创建一个新的和原来array形状一样的,但是元素为1的新的array
|
Python
numpy重新学习系列(5)---如何用np.zeros_like创建一个新的和原来array形状一样的,但是元素为0的新的array
numpy重新学习系列(5)---如何用np.zeros_like创建一个新的和原来array形状一样的,但是元素为0的新的array
129 0
numpy重新学习系列(5)---如何用np.zeros_like创建一个新的和原来array形状一样的,但是元素为0的新的array
|
Python
numpy重新学习系列(10)---如何用np.arange生成均匀间隔分布的array
numpy重新学习系列(10)---如何用np.arange生成均匀间隔分布的array
103 0
|
Python
numpy重新学习系列(6)---如何用np.ones创建一个新的array,里面元素是1
numpy重新学习系列(6)---如何用np.ones创建一个新的array,里面元素是1
71 0
|
Python
numpy重新学习系列(4)---如何用np.zeros创建填充元素为0的array
numpy重新学习系列(4)---如何用np.zeros创建填充元素为0的array
117 0
|
Python
numpy重新学习系列(3)---如何创建一个array-四种从其他形式转化成array的方法
numpy重新学习系列(3)---如何创建一个array-四种从其他形式转化成array的方法
130 0