Python手動清理內存

寫程序這方面,自己不是科班出身,本科時唯一的C語言課也沒有好好聽講。導致后來寫代碼的時候十分不規范,也缺失了許多細節,日常遇到的自己給自己挖的坑還是有必要記錄一下,方便以后復盤。

就像現在,前腳寫完的代碼后腳就忘了怎么寫了……

這段代碼主要是處理了一下打文件讀取過程中內存不夠的問題,中間也對DataFrame進行了一系列操作,結果具體的操作怎么實現的自己已經不記得了……目前還沒調試好。

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'):
    '''分批傳入,寫出,處理數據,清理內存,從硬盤讀取,輸出'''
    if os.path.isfile('test_tmp.csv'):
        os.remove('test_tmp.csv')
    for i in range(1,df_in.shape[0]//batch):
        #Pandas擴列操作         
        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中對字符串列進行擴列時可以使用df['column'].str.split(',',expand=True)的方法來根據間隔類型來處理,但這本質是Series的方法,DataFrame中只能針對列來操作;
  • DataFrame中想要改變單元格中的值可以使用df.map(dict)的方法,傳入一個字典來實現修改內容的映射;
  • 使用batch對python對象進行切片時注意最后一部分的遺留問題;
  • 手動釋放內存時逐次執行del a;gc.collect();
  • 可以df.to_csv(mode='a',header=False)來完成內容追加,注意同時指定header=False來確保不打印表頭;
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。