Python手動(dòng)清理內(nèi)存

寫(xiě)程序這方面,自己不是科班出身,本科時(shí)唯一的C語(yǔ)言課也沒(méi)有好好聽(tīng)講。導(dǎo)致后來(lái)寫(xiě)代碼的時(shí)候十分不規(guī)范,也缺失了許多細(xì)節(jié),日常遇到的自己給自己挖的坑還是有必要記錄一下,方便以后復(fù)盤(pán)。

就像現(xiàn)在,前腳寫(xiě)完的代碼后腳就忘了怎么寫(xiě)了……

這段代碼主要是處理了一下打文件讀取過(guò)程中內(nèi)存不夠的問(wèn)題,中間也對(duì)DataFrame進(jìn)行了一系列操作,結(jié)果具體的操作怎么實(shí)現(xiàn)的自己已經(jīng)不記得了……目前還沒(méi)調(diào)試好。

import pandas as pd
import numpy as np
import gc
import os

feature = ['111,222,333,444',
           '111,222,333,444',
           '111,222,333,444',
           '111,222,333,444',
           '111,222,333,444',
           '111,222,333,444']
dict_in = {'111':'yiyiyi','222':'ererer','333':'sjsjsj','444':'sisisi'}
df = pd.DataFrame(feature,columns=['test'])

def batch_in(df_in,batch,dict_in,str_in='test'):
    '''分批傳入,寫(xiě)出,處理數(shù)據(jù),清理內(nèi)存,從硬盤(pán)讀取,輸出'''
    if os.path.isfile('test_tmp.csv'):
        os.remove('test_tmp.csv')
    for i in range(1,df_in.shape[0]//batch):
        #Pandas擴(kuò)列操作         
        df_tmp = df_in[str_in][batch*(i-1):batch*i].str.split(',',expand=True)
        for j in df_tmp.columns:
            df_tmp[j] = df_tmp[j].map(dict_in)
        df_tmp.to_csv('test_tmp.csv',mode='a',header=False,index=0)
        del df_tmp
        gc.collect()

    df_tmp = df_in[str_in][batch*(df_in.shape[0]//batch-1):].str.split(',',expand=True)
    for j in df_tmp.columns:
        df_tmp[j] = df_tmp[j].map(dict_in)
    df_tmp.to_csv('test_tmp.csv',mode='a',header=False,index=0)
    del df_tmp
    gc.collect()
    df_out = []
    with open('test_tmp.csv','r') as f:
        for line in f:
            df_out.append(line.strip())
    return df_out

df_out = batch_in(df,1,dict_in)
  • DataFrame中對(duì)字符串列進(jìn)行擴(kuò)列時(shí)可以使用df['column'].str.split(',',expand=True)的方法來(lái)根據(jù)間隔類(lèi)型來(lái)處理,但這本質(zhì)是Series的方法,DataFrame中只能針對(duì)列來(lái)操作;
  • DataFrame中想要改變單元格中的值可以使用df.map(dict)的方法,傳入一個(gè)字典來(lái)實(shí)現(xiàn)修改內(nèi)容的映射;
  • 使用batch對(duì)python對(duì)象進(jìn)行切片時(shí)注意最后一部分的遺留問(wèn)題;
  • 手動(dòng)釋放內(nèi)存時(shí)逐次執(zhí)行del a;gc.collect();
  • 可以df.to_csv(mode='a',header=False)來(lái)完成內(nèi)容追加,注意同時(shí)指定header=False來(lái)確保不打印表頭;
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容