欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解解決Python memory error的問題(四種解決方案)

 更新時(shí)間:2019年08月08日 11:05:45   作者:小白白白又白cdllp  
這篇文章主要介紹了詳解解決Python memory error的問題(四種解決方案),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

昨天在用用Pycharm讀取一個(gè)200+M的CSV的過程中,竟然出現(xiàn)了Memory Error!簡(jiǎn)直讓我懷疑自己買了個(gè)假電腦,畢竟是8G內(nèi)存i7處理器,一度懷疑自己裝了假的內(nèi)存條。。。。下面說一下幾個(gè)解題步驟。。。。一般就是用下面這些方法了,按順序試試。

一、逐行讀取

如果你用pd.read_csv來讀文件,會(huì)一次性把數(shù)據(jù)都讀到內(nèi)存里來,導(dǎo)致內(nèi)存爆掉,那么一個(gè)想法就是一行一行地讀它,代碼如下:

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的每一行讀成一個(gè)字符串,然后因?yàn)閏sv都是靠逗號(hào)分隔符來分割每列的數(shù)據(jù)的,那么通過逗號(hào)分割就可以把這些列都分離開了,然后把每一行的list都放到一個(gè)list中,形成二維數(shù)組,再轉(zhuǎn)換成DataFrame。

這個(gè)方法有一些問題,首先讀進(jìn)來之后索引和列名都需要重新調(diào)整,其次很多數(shù)字的類型都發(fā)生了變化,變成了字符串,最后是最后一列會(huì)把換行符包含進(jìn)去,需要用replace替換掉。

不知道為什么,用了這個(gè)操作之后,還是出現(xiàn)了Memory error的問題?;谶@些缺點(diǎn)以及遺留問題,考慮第二種解決方案。

二、巧用pandas中read_csv的塊讀取功能

pandas設(shè)計(jì)時(shí)應(yīng)該是早就考慮到了這些可能存在的問題,所以在read功能中設(shè)計(jì)了塊讀取的功能,也就是不會(huì)一次性把所有的數(shù)據(jù)都放到內(nèi)存中來,而是分塊讀到內(nèi)存中,最后再將塊合并到一起,形成一個(gè)完整的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,這是指定每個(gè)塊包含的行數(shù)。

這個(gè)方法能夠保持?jǐn)?shù)據(jù)的類型,也不需要自己費(fèi)心思去調(diào)整列名和index,比較方便。但不幸的是,我的還是出現(xiàn)了這個(gè)問題,如果你的用了這種方法還是出現(xiàn)memory error,你可以繼續(xù)往下看。

三、擴(kuò)充虛擬內(nèi)存

我在運(yùn)行代碼的過程中發(fā)現(xiàn),出現(xiàn)memory error錯(cuò)誤的時(shí)候,其實(shí)我的內(nèi)存只用到了40+%,所以其實(shí)不太可能會(huì)出現(xiàn)這個(gè)錯(cuò)誤啊,所以我查了下,發(fā)現(xiàn)有說是內(nèi)存被限制了,考慮關(guān)掉一些可能限制內(nèi)存的軟件啦,擴(kuò)大虛擬內(nèi)存啦,這些的。

擴(kuò)大虛擬內(nèi)存的方法(我的系統(tǒng)是win8,不過應(yīng)該都大同小異):
1、打開 控制面板;
2、找到 系統(tǒng) 這一項(xiàng);
3、找到 高級(jí)系統(tǒng)設(shè)置 這一項(xiàng);
4、點(diǎn)擊 性能 模塊的 設(shè)置 按鈕;
5、選擇 高級(jí)面板,在 虛擬內(nèi)存 模塊點(diǎn)擊更改;
6、記得 不要 選中“自動(dòng)管理所有驅(qū)動(dòng)器的分頁(yè)文件大小”,然后選擇一個(gè)驅(qū)動(dòng)器,也就是一個(gè)盤,選中自定義大小,手動(dòng)輸入初始大小和最大值,當(dāng)然,最好不要太大,更改之后能在查看盤的使用情況,不要丟掉太多空間。
7、都設(shè)置好之后,記得點(diǎn)擊 “設(shè)置”, 然后再確定,否則無(wú)效,最后 重啟電腦 就可以了。

悲劇的是我在設(shè)置完這一步之后還是出現(xiàn)了內(nèi)存錯(cuò)誤,到這一步就沒有問題了的朋友就可以不用看下面一種解法了,如果還是有問題,可以接下來看。

四、更新Pandas和Numpy庫(kù)為64位

如果你的Python用的是32位的,那么你的pandas和Numpy也只能是32位的,那么當(dāng)你的內(nèi)存使用超過2G時(shí),就會(huì)自動(dòng)終止內(nèi)存。發(fā)現(xiàn)這個(gè)錯(cuò)誤也是因?yàn)槲也煊X到報(bào)內(nèi)存溢出的錯(cuò)誤的時(shí)候,我的內(nèi)存明明顯示只用了40+%,然后錯(cuò)誤提示是在pandas的core中,所以查了一下,發(fā)現(xiàn)原來還有這么個(gè)大坑。

解決方法就是:先檢查一下你的python是多少位的,在shell中輸入python,查看位數(shù),如果是32位,那么就重裝Python,裝一個(gè)64位的,但同時(shí)你的庫(kù)也需要重新裝了。不過我執(zhí)行完這一步之后,問題就完美解決了!

五、如果還有內(nèi)存溢出的錯(cuò)

以上四種方法,按順序逐一使用,到哪一步錯(cuò)誤消失了就可以停止啦。當(dāng)然了,如果你的內(nèi)存顯示使用達(dá)到了99%+,那么就是內(nèi)存真的不夠用,不是別的問題,如果不是數(shù)據(jù)量特別大,那就是寫代碼的時(shí)候的習(xí)慣問題,雖然Python有垃圾回收機(jī)制,但是有時(shí)候可能來不及回收,尤其是在循環(huán)迭代這些過程中,往往會(huì)循環(huán)完畢了才來得及收拾垃圾,所以記得及時(shí)把不要的變量del掉,或者用gc這個(gè)垃圾回收庫(kù),這樣內(nèi)存自然就一直清清爽爽啦~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python+mysql實(shí)現(xiàn)個(gè)人論文管理系統(tǒng)

    python+mysql實(shí)現(xiàn)個(gè)人論文管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了python+mysql實(shí)現(xiàn)個(gè)人論文管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • python爬取網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)換為PDF文件

    python爬取網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)換為PDF文件

    這篇文章主要為大家詳細(xì)介紹了python爬取網(wǎng)頁(yè)內(nèi)容轉(zhuǎn)換為PDF文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python?分形算法代碼詳解

    Python?分形算法代碼詳解

    分形算法就是使用計(jì)算機(jī)程序模擬出大自然界的分形幾何圖案,是分形幾何數(shù)學(xué)與計(jì)算機(jī)科學(xué)相融合的藝術(shù),今天小編通過本文給大家介紹Python?分形算法實(shí)現(xiàn)代碼,感興趣的朋友一起看看吧
    2022-03-03
  • 對(duì)Python3 * 和 ** 運(yùn)算符詳解

    對(duì)Python3 * 和 ** 運(yùn)算符詳解

    今天小編就為大家分享一篇對(duì)Python3 * 和 ** 運(yùn)算符詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • python模塊itsdangerous簡(jiǎn)單介紹

    python模塊itsdangerous簡(jiǎn)單介紹

    這篇文章主要介紹了python模塊itsdangerous簡(jiǎn)單介紹,本文通過案例分析給大家詳細(xì)講解,對(duì)python模塊itsdangerous相關(guān)知識(shí)感興趣的朋友一起看看吧
    2022-11-11
  • Python實(shí)現(xiàn)字符串模糊匹配的兩種實(shí)現(xiàn)方法

    Python實(shí)現(xiàn)字符串模糊匹配的兩種實(shí)現(xiàn)方法

    本文主要介紹了Python實(shí)現(xiàn)字符串模糊匹配的兩種實(shí)現(xiàn)方法,Python中通過re.search()方法實(shí)現(xiàn),對(duì)于首位起始的內(nèi)容匹配,也可通過re.match()方法實(shí)現(xiàn),感興趣的可以了解一下
    2023-11-11
  • 三個(gè)Python自動(dòng)化辦公好用到爆的模塊分享

    三個(gè)Python自動(dòng)化辦公好用到爆的模塊分享

    本文小編來給大家推薦幾個(gè)在自動(dòng)化辦公領(lǐng)域當(dāng)中非常好用的Python模塊,可以幫助大家在工作當(dāng)中及大地提高效率,避免重復(fù)機(jī)械化地操作流程
    2022-07-07
  • Django錯(cuò)誤:TypeError at / ''bool'' object is not callable解決

    Django錯(cuò)誤:TypeError at / ''bool'' object is not callable解決

    這篇文章主要介紹了Django 錯(cuò)誤:TypeError at / 'bool' object is not callable解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解)

    Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解)

    這篇文章主要介紹了Python 將代碼轉(zhuǎn)換為可執(zhí)行文件脫離python環(huán)境運(yùn)行(步驟詳解),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • python使用tkinter打造三維繪圖系統(tǒng)的示例代碼

    python使用tkinter打造三維繪圖系統(tǒng)的示例代碼

    Python?的?tkinter?模塊是一個(gè)常用的?GUI(圖形用戶界面)工具包,它能夠讓你創(chuàng)建窗口應(yīng)用程序,你可以使用它來構(gòu)建用戶友好的界面,包括按鈕、標(biāo)簽、文本框、列表框等各種控件,本文講給大家介紹如何使用tkinter打造三維繪圖系統(tǒng),需要的朋友可以參考下
    2023-08-08

最新評(píng)論