前情提要: python
工做緣由須要處理一批約30G左右的CSV數據,數據量級不須要hadoop的使用,同時因爲辦公的本本內存較低的緣故,須要解讀取數據時內存不足的緣由。app
操做流程:ide
方法與方式:首先是讀取數據,常見的csv格式讀取時一次性所有讀取進來, 面對數據量較大(本次3億條實車數據)時,須要 分批 而且有 選擇性 的讀取後 提取有效信息 刪除冗餘信息並清理內存。oop
同時,爲了使處理數據時效率更高,將整理好的數據實時讀取進來之後,保存成快速且可讀的數據形式另行存儲。而後釋放內存並讀取下一批數據直到整個流程結束大數據
下面是操做代碼:spa
#import pickle # pkl存儲與 hdf5存儲
import pandas as pd # 釋放內存
import gc reader = pd.read_csv(r'E:\VEH_GBK_2019-01-01.csv', encoding='gbk',iterator=True,low_memory=False,usecols=[0,1,2,4]) title_mc=['location','vid','上報時間','充電狀態'] loop = True chunkSize = 1000000 ans_vid={} location_list=['上海','重慶','廣東','北京'] for i in location_list: ans_vid[i]=[] while loop: try: chunk = reader.get_chunk(chunkSize) chunk.columns=title_mc; chunk['充電狀態']=chunk['充電狀態'].astype(str) chunk['location']=chunk['location'].astype(str) for i in location_list: temp=chunk[chunk['location'].str.contains(i)] if temp[(temp['充電狀態']=='1.0') | (temp['充電狀態']=='4.0')].empty==False: ans_vid[i].append(temp[(temp['充電狀態']=='1.0') | (temp['充電狀態']=='4.0')]) del temp gc.collect() del chunk gc.collect() except StopIteration: loop = False print ("Iteration is stopped.") for i in location_list: ans_vid[i]=pd.concat(ans_vid[i]) location_list=['shanghai','chongqing','guangdong','beijing'] for i in location_list: ans_vid[i].to_hdf(i+'_charging.h5',key=ans_vid[i],encoding='gbk')
gc.collect()放在del 參數的後面用以及時釋放內存。code
讀取的核心代碼是:blog
reader = pd.read_csv(r'E:\VEH_GBK_2019-01-01.csv', encoding='gbk',iterator=True,low_memory=False,usecols=[0,1,2,4]) # usecols是讀取原數據的某幾列 chunkSize是分批讀取的量級
chunk = reader.get_chunk(chunkSize)
本次讀取的存儲格式採用的是h5格式即hdf,該種格式易於讀取較大數據量級,同時也有一些數據格式能夠保存較大的數據量級: pkl ,npy等內存
推薦h5(保存dataframe)與pkl(保存字典格式),其讀取速度更快.易於使用hadoop
h5格式調用pandas內置對dataframe的保存便可: 例 df是一個須要保存的較大的dataframe。代碼爲
df.to_hdf('123.h5',encoding='gbk',key='df')
pkl 保存須要先導入pickle ,所需保存的字典爲ans_vid, 代碼以下
# 導出
output = open('usage_top2veh.pkl', 'wb') pickle.dump(ans_vid, output) output.close() # 導入
pkl_file = open('usage_top2veh.pkl', 'rb') data2 = pickle.load(pkl_file) pkl_file.close()