1. 程式人生 > >Pandas讀取較大資料量級的處理方法 - chunk

Pandas讀取較大資料量級的處理方法 - chunk

 

前情提要:   

工作原因需要處理一批約30G左右的CSV資料,資料量級不需要使用hadoop的使用,同時由於辦公的本本記憶體較低的緣故,需要解讀取資料時記憶體不足的原因。

操作流程:

方法與方式:首先是讀取資料,常見的csv格式讀取時一次性全部讀取進來, 面對資料量較大(本次3億條實車資料)時,需要 分批 並且有 選擇性 的讀取後 提取有效資訊 刪除冗餘資訊並清理記憶體。

同時,為了使處理資料時效率更高,將整理好的資料實時讀取進來以後,儲存成快速且可讀的資料形式另行儲存。然後釋放記憶體並讀取下一批資料直到整個流程結束

 

下面是操作程式碼:

#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')
View Code

gc.collect()放在del 引數的後面用以及時釋放記憶體。

讀取的核心程式碼是:

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(儲存字典格式),其讀取速度更快.易於使用

&n