身為常常寫出地獄爛扣把機器弄爆炸的資料分析師,面對這次 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 處理大資料的技巧。