本文简要概括出现类似于 numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array with shape (370, 370) and data type float64
报错信息的原因及解决方法。
更新:2023 / 2 / 4
报错
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
-> (typeVM 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>
参考链接
-
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位的 ↩︎文章来源:https://www.toymoban.com/news/detail-407661.html
-
MemoryError: Unable to allocate array with shape (61721, 16000) and data typ ↩︎文章来源地址https://www.toymoban.com/news/detail-407661.html
到了这里,关于Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!