詳解解決Python memory error的問題(四種解決方案)
昨天在用用Pycharm讀取一個200+M的CSV的過程中,竟然出現(xiàn)了Memory Error!簡直讓我懷疑自己買了個假電腦,畢竟是8G內(nèi)存i7處理器,一度懷疑自己裝了假的內(nèi)存條。。。。下面說一下幾個解題步驟。。。。一般就是用下面這些方法了,按順序試試。
一、逐行讀取
如果你用pd.read_csv來讀文件,會一次性把數(shù)據(jù)都讀到內(nèi)存里來,導(dǎo)致內(nèi)存爆掉,那么一個想法就是一行一行地讀它,代碼如下:
data = [] with open(path, 'r',encoding='gbk',errors='ignore') as f: for line in f: data.append(line.split(',')) data = pd.DataFrame(data[0:100])
這就是先用with open把csv的每一行讀成一個字符串,然后因為csv都是靠逗號分隔符來分割每列的數(shù)據(jù)的,那么通過逗號分割就可以把這些列都分離開了,然后把每一行的list都放到一個list中,形成二維數(shù)組,再轉(zhuǎn)換成DataFrame。
這個方法有一些問題,首先讀進來之后索引和列名都需要重新調(diào)整,其次很多數(shù)字的類型都發(fā)生了變化,變成了字符串,最后是最后一列會把換行符包含進去,需要用replace替換掉。
不知道為什么,用了這個操作之后,還是出現(xiàn)了Memory error的問題?;谶@些缺點以及遺留問題,考慮第二種解決方案。
二、巧用pandas中read_csv的塊讀取功能
pandas設(shè)計時應(yīng)該是早就考慮到了這些可能存在的問題,所以在read功能中設(shè)計了塊讀取的功能,也就是不會一次性把所有的數(shù)據(jù)都放到內(nèi)存中來,而是分塊讀到內(nèi)存中,最后再將塊合并到一起,形成一個完整的DataFrame。
f = open(path) data = pd.read_csv(path, sep=',',engine = 'python',iterator=True) loop = True chunkSize = 1000 chunks = [] index=0 while loop: try: print(index) chunk = data.get_chunk(chunkSize) chunks.append(chunk) index+=1 except StopIteration: loop = False print("Iteration is stopped.") print('開始合并') data = pd.concat(chunks, ignore_index= True)
以上代碼規(guī)定用迭代器分塊讀取,并規(guī)定了每一塊的大小,即chunkSize,這是指定每個塊包含的行數(shù)。
這個方法能夠保持?jǐn)?shù)據(jù)的類型,也不需要自己費心思去調(diào)整列名和index,比較方便。但不幸的是,我的還是出現(xiàn)了這個問題,如果你的用了這種方法還是出現(xiàn)memory error,你可以繼續(xù)往下看。
三、擴充虛擬內(nèi)存
我在運行代碼的過程中發(fā)現(xiàn),出現(xiàn)memory error錯誤的時候,其實我的內(nèi)存只用到了40+%,所以其實不太可能會出現(xiàn)這個錯誤啊,所以我查了下,發(fā)現(xiàn)有說是內(nèi)存被限制了,考慮關(guān)掉一些可能限制內(nèi)存的軟件啦,擴大虛擬內(nèi)存啦,這些的。
擴大虛擬內(nèi)存的方法(我的系統(tǒng)是win8,不過應(yīng)該都大同小異):
1、打開 控制面板;
2、找到 系統(tǒng) 這一項;
3、找到 高級系統(tǒng)設(shè)置 這一項;
4、點擊 性能 模塊的 設(shè)置 按鈕;
5、選擇 高級面板,在 虛擬內(nèi)存 模塊點擊更改;
6、記得 不要 選中“自動管理所有驅(qū)動器的分頁文件大小”,然后選擇一個驅(qū)動器,也就是一個盤,選中自定義大小,手動輸入初始大小和最大值,當(dāng)然,最好不要太大,更改之后能在查看盤的使用情況,不要丟掉太多空間。
7、都設(shè)置好之后,記得點擊 “設(shè)置”, 然后再確定,否則無效,最后 重啟電腦 就可以了。
悲劇的是我在設(shè)置完這一步之后還是出現(xiàn)了內(nèi)存錯誤,到這一步就沒有問題了的朋友就可以不用看下面一種解法了,如果還是有問題,可以接下來看。
四、更新Pandas和Numpy庫為64位
如果你的Python用的是32位的,那么你的pandas和Numpy也只能是32位的,那么當(dāng)你的內(nèi)存使用超過2G時,就會自動終止內(nèi)存。發(fā)現(xiàn)這個錯誤也是因為我察覺到報內(nèi)存溢出的錯誤的時候,我的內(nèi)存明明顯示只用了40+%,然后錯誤提示是在pandas的core中,所以查了一下,發(fā)現(xiàn)原來還有這么個大坑。
解決方法就是:先檢查一下你的python是多少位的,在shell中輸入python,查看位數(shù),如果是32位,那么就重裝Python,裝一個64位的,但同時你的庫也需要重新裝了。不過我執(zhí)行完這一步之后,問題就完美解決了!
五、如果還有內(nèi)存溢出的錯
以上四種方法,按順序逐一使用,到哪一步錯誤消失了就可以停止啦。當(dāng)然了,如果你的內(nèi)存顯示使用達到了99%+,那么就是內(nèi)存真的不夠用,不是別的問題,如果不是數(shù)據(jù)量特別大,那就是寫代碼的時候的習(xí)慣問題,雖然Python有垃圾回收機制,但是有時候可能來不及回收,尤其是在循環(huán)迭代這些過程中,往往會循環(huán)完畢了才來得及收拾垃圾,所以記得及時把不要的變量del掉,或者用gc這個垃圾回收庫,這樣內(nèi)存自然就一直清清爽爽啦~
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python+mysql實現(xiàn)個人論文管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python+mysql實現(xiàn)個人論文管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10python爬取網(wǎng)頁內(nèi)容轉(zhuǎn)換為PDF文件
這篇文章主要為大家詳細(xì)介紹了python爬取網(wǎng)頁內(nèi)容轉(zhuǎn)換為PDF文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06Python實現(xiàn)字符串模糊匹配的兩種實現(xiàn)方法
本文主要介紹了Python實現(xiàn)字符串模糊匹配的兩種實現(xiàn)方法,Python中通過re.search()方法實現(xiàn),對于首位起始的內(nèi)容匹配,也可通過re.match()方法實現(xiàn),感興趣的可以了解一下2023-11-11Django錯誤:TypeError at / ''bool'' object is not callable解決
這篇文章主要介紹了Django 錯誤:TypeError at / 'bool' object is not callable解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運行(步驟詳解)
這篇文章主要介紹了Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運行(步驟詳解),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01python使用tkinter打造三維繪圖系統(tǒng)的示例代碼
Python?的?tkinter?模塊是一個常用的?GUI(圖形用戶界面)工具包,它能夠讓你創(chuàng)建窗口應(yīng)用程序,你可以使用它來構(gòu)建用戶友好的界面,包括按鈕、標(biāo)簽、文本框、列表框等各種控件,本文講給大家介紹如何使用tkinter打造三維繪圖系統(tǒng),需要的朋友可以參考下2023-08-08