放開那記憶體!之 Python 處理大資料

Pei Lee
3 min readJul 15, 2018

--

2018 104 Hackathon 資料處理中的截圖

身為常常寫出地獄爛扣把機器弄爆炸的資料分析師,面對這次 104 Hackathon 10 GB 的資料,覺得有必要事先研究一下怎麼不把記憶體弄爆,並且加快資料處理速度,以下整理了一些技巧。

刪掉變數後叫垃圾車載走

這是在 Kaggle 幾乎每個人都會用的技巧,大概就如下所示,del(delete)掉變數,再呼叫垃圾車:

import gcdel dfgc.collect()

調整資料型態

這個技巧是從 Using pandas with large data 看來的,根據作者實測,調整過後的資料型態能夠節省接近 90% 的記憶體,詳情請點入文章連結閱讀,這邊只簡述方法。

原來 Pandas 的資料型態除了已知的 float、int 還有所謂的子型態,例如 float 有子型態 float16、float32、float64,而 float16 能夠以較少 bytes 去儲存一個浮點數。實際呼叫方式如下:

import pandas as pddata = pd.concat( [
data.select_dtypes( include=['float'] )
.apply( pd.to_numeric, downcast='float' ),
data.select_dtypes( exclude=['float'] )
],
axis=1
)

選出目前資料型態是 float 的欄位,並呼叫 to_numeric 方法把現有資料型態轉成最小能儲存的子型態,其中 downcast 那邊可選擇 float、signed(整數)、unsigned(正整數)。

分批載入資料

接下來兩個技巧主要出自於 Multi-Processing With Pandas,這次 104 Hackathon 其中一個 table 有 1 億多筆資料,因此必須分批載入資料做處理,方法如下:

import pandas as pdreader = pd.read_sql ( 'SELECT * FROM TABLE_NAME', 
chunksize=100000 )
for df in reader:
# Data Process Code

多核處理

到前一陣子才驚訝地發現,如果沒有特別開多核心處理,電腦只會用單核心處理 Python 程式碼,於是了解了一下該怎麼開多核心,主要是看了 Multi-Thread 與 Multi-Process,解釋得很詳細。個人實際用的方式如下:

import multiprocessing as mppool = mp.Pool(6) # 裡面填要開幾核心result = pool.map( data_process_function, dfs )
# dfs 為裝了很多 Pandas DataFrame 的 list

以上,是個人主要用到的幾個 Python 處理大資料的技巧。

--

--

Pei Lee
Pei Lee

Written by Pei Lee

Data Team Lead @ Retail & E-commerce Industry

No responses yet