我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array

本文简要概括出现类似于 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


报错

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

原因

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


解决方案

参考这里 34


修改 float 精度

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


python 库、Pandas 和 Numpy 库更新为 64

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


如果你的 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_dataif __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 basedwith open(...) as f:    for line in f:        process(line) # 

参考链接


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

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

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

  4. Very large matrices using Python and NumPy ↩︎

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

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

来源地址:https://blog.csdn.net/MissMango0820/article/details/128871441

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录