本文簡要概括出現(xiàn)類似于 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
內(nèi)存不足,因為需要處理的數(shù)據(jù)量太大,GPU性能不夠,存在內(nèi)存溢出現(xiàn)象 1’ 2。
解決方案
參考這里 3’ 4
修改 float 精度
在代碼中使用的是 flaot 64
類型,然而實際上未必需要這么大的精度,這時候可以使用 numpy
中的 float32
,float16
等,這樣可以降低很多的內(nèi)存需求。
python 庫、Pandas 和 Numpy 庫更新為 64 位
python
原始的數(shù)據(jù)類型是 32 bit
,但是最大只能使用 2G
內(nèi)存,超過 2G
報錯 MemoryError
。
如果你的 Python
用的是 32 bit
的,那么你的 pandas
和 Numpy
也只能是 32 bit
的,那么當(dāng)你的內(nèi)存使用超過 2G
時,就會自動終止內(nèi)存。而 64bit
python
則無此限制。
因此,可以先檢查自己安裝的 python
是多少位的 5,如果是 32 bit
,那么就重裝 64 bit
的 Python
。
如果你的 python
本來安裝的就是 64
位的,可以采用下面的方法
擴充虛擬內(nèi)存
在運行代碼的過程中發(fā)現(xiàn),內(nèi)存其實只用到了一半不到,但是為什么會出現(xiàn) Memory
的錯誤呢?
進過百度發(fā)現(xiàn)說是內(nèi)存被限制了,所以考慮采用擴大虛擬內(nèi)存的方法。
對于 windows
系統(tǒng),擴大虛擬內(nèi)存的方法:
- 打開
控制面板
; - 點擊
系統(tǒng)
這一項; - 點擊
高級系統(tǒng)設(shè)置
這一項; - 點擊
性能
模塊的設(shè)置
按鈕; - 選擇
高級面板
,點擊更改虛擬內(nèi)存
模塊; - 記得不要選中
自動管理所有驅(qū)動器的分頁文件大小
,然后選擇一個驅(qū)動器,也就是一個盤,選中自定義大小,手動輸入初始大小和最大值,但是不要太大。 - 都設(shè)置好之后,記得點擊
設(shè)置
, 然后再確定,否則無效,最后重啟電腦
就可以了。
修改 pycharm
的運行內(nèi)存 6,
-
Help
->Find Action
-> (typeVM Options
) ->(Click)Edit Custom VM Options
- 打開
pycharm64.exe.vmoptions
進行編輯 - 修改
-Xmx750m
為-Xmx4096m
- 分配
4G
內(nèi)存,視情況而定。 - 保存并重啟
pycharm
更改 Python 讀取大文件的方法
出現(xiàn) memoryError
錯誤和文件讀取太慢的問題,后來找到了兩種比較快 Large File Reading
的方法,這里將介紹這兩種讀取方法。
Preliminary
我們談到 文本處理
時,我們通常是指處理的內(nèi)容。Python
將文本文件的內(nèi)容讀入可以操作的字符串變量非常容易。
文件對象提供了三個 讀
方法,.read()
、.readline()
和 .readlines()
。每種方法可以接受一個變量以限制每次讀取的數(shù)據(jù)量,但它們通常不使用變量。
.read()
每次讀取整個文件,它通常用于將文件內(nèi)容放到一個字符串變量中。然而 .read()
生成文件內(nèi)容最直接的字符串表示,但對于連續(xù)的面向行的處理,它卻是不必要的,并且如果文件大于可用內(nèi)存,則不可能實現(xiàn)這種處理。
下面是 .read()
方法示例:
try:
f = open('/path/to/file', 'r')
print f.read()
finally:
if f:
f.close()
調(diào)用 read()
會一次性讀取文件的全部內(nèi)容,如果文件有 10G
,內(nèi)存就爆了,所以,要保險起見,可以反復(fù)調(diào)用 read(size)
方法,每次最多讀取 size
個字節(jié)的內(nèi)容。
另外,調(diào)用 readline()
可以每次讀取一行內(nèi)容,調(diào)用 readlines()
一次讀取所有內(nèi)容并按行返回list
。因此,要根據(jù)需要決定怎么調(diào)用。
如果文件很小,read()
一次性讀取最方便;如果不能確定文件大小,反復(fù)調(diào)用 read(size)
比較保險;如果是配置文件,調(diào)用 readlines()
最方便:
for line in f.readlines():
process(line) # <do something with line>
Read In Chunks
處理大文件是很容易想到的就是將大文件分割成若干小文件處理,處理完每個小文件后釋放該部分內(nèi)存。這里用了 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
語句打開和關(guān)閉文件,包括拋出一個內(nèi)部塊異常。for line in f
文件對象 f
視為一個迭代器,會自動的采用緩沖 IO
和內(nèi)存管理,所以你不必?fù)?dān)心大文件。
#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位的 ??文章來源:http://www.zghlxwxcb.cn/news/detail-407661.html
-
MemoryError: Unable to allocate array with shape (61721, 16000) and data typ ??文章來源地址http://www.zghlxwxcb.cn/news/detail-407661.html
到了這里,關(guān)于Python | NumPy | numpy.core._exceptions.MemoryError: Unable to allocate 1.04 MiB for an array的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!