Python

您所在的位置:网站首页 incapable和unable Python

Python

#Python | 来源: 网络整理| 查看: 265

本文简要概括出现类似于 numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array with shape (370, 370) and data type float64 报错信息的原因及解决方法。

更新:2023 / 2 / 4

Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array 报错原因解决方案修改 `float` 精度python 库、Pandas 和 Numpy 库更新为 `64` 位扩充虚拟内存更改 Python 读取大文件的方法PreliminaryRead In ChunksUsing with open() 参考链接

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

主要原因是电脑 RAM 内存不足,因为需要处理的数据量太大,GPU性能不够,存在内存溢出现象 1’ 2。

解决方案

参考这里 3’ 4

修改 float 精度

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

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

python 原始的数据类型是 32 bit,但是最大只能使用 2G 内存,超过 2G 报错 MemoryError。 如果你的 Python 用的是 32 bit 的,那么你的 pandas 和 Numpy 也只能是 32 bit 的,那么当你的内存使用超过 2G 时,就会自动终止内存。而 64bit python 则无此限制。 因此,可以先检查自己安装的 python 是多少位的 5,如果是 32 bit,那么就重装 64 bit 的 Python。

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

扩充虚拟内存

在运行代码的过程中发现,内存其实只用到了一半不到,但是为什么会出现 Memory 的错误呢? 进过百度发现说是内存被限制了,所以考虑采用扩大虚拟内存的方法。

对于 windows 系统,扩大虚拟内存的方法:

打开 控制面板;点击 系统 这一项;点击 高级系统设置 这一项;点击 性能 模块的 设置 按钮;选择 高级面板,点击更改 虚拟内存 模块;记得不要选中 自动管理所有驱动器的分页文件大小,然后选择一个驱动器,也就是一个盘,选中自定义大小,手动输入初始大小和最大值,但是不要太大。都设置好之后,记得点击 设置, 然后再确定,否则无效,最后 重启电脑 就可以了。

修改 pycharm 的运行内存 6,

Help -> Find Action -> (type VM Options) ->(Click) Edit Custom VM Options打开 pycharm64.exe.vmoptions 进行编辑修改 -Xmx750m 为 -Xmx4096m分配 4G 内存,视情况而定。保存并重启 pycharm 更改 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) # 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) # 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) # 参考链接

Numpy.core._exceptions.MemoryError: Unable to allocate array with shape (51, 6, 64, 2) and data type float32 ↩︎

MemoryError: Unable to allocate MiB for an array with shape and data type, when using anymodel.fit() in sklearn ↩︎

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

Very large matrices using Python and NumPy ↩︎

查看python是32位的还是64位的 ↩︎

MemoryError: Unable to allocate array with shape (61721, 16000) and data typ ↩︎



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3