草庐IT

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

MissMango0820 2023-05-29 原文

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

参考链接


  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 ↩︎

有关Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务? - 2

    如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  9. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  10. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

随机推荐