はじめに
CSVファイルなどの巨大データを読み込む際、読み込みだけでなくパース処理なども行われるので、非常に時間がかかります。
Pythonでは、DataFrameやその他オブジェクトを、Pickle(漬物)としてファイルに出力することで、次回以降の読み込みを高速化することが可能です。
Pickleファイルを読み込むことで、オブジェクトを再利用できます。また、CSVなどのファイルから読み込むのに対して、非常に高速です。
Pickle化は、通常のファイル出力と同じように出力できます。
注意点としては、openのモードはwb(rb)、また、巨大データを出力する際はサイズ制限があるので、dump時にprotocol=4とするくらいです。
1 2 3 4 5 6 7 8 9 10 11 |
import pickle # df・・・Pickleにしたいオブジェクト # Pickleとして出力 with open('example.pickle', 'wb') as f: pickle.dump(df, f, protocol=4) # Piclkleを読み込み with open('example.pickle', 'rb') as f: df = pickle.load(f) |
以下、速度比較
テスト用のCSV作成
巨大ファイルとは言い難いですが、今回は検証として約2GBのテーブルデータを作成。CSVとして出力しました。
1 2 3 4 |
# テストデータ作成 # 1000000×100 1.98GB data = make_classification(n_samples=1000000, n_features=100, n_classes=2) pd.DataFrame(data[0]).to_csv('~/example.csv') |
pd.read_csv()でCSVファイル読み込み
pd.read_csv()で通常通り読み込み。43.4s
1 2 3 4 5 6 |
%%time df = pd.read_csv('~/example.csv') # CPU times: user 32.6 s, sys: 2.45 s, total: 35 s # Wall time: 43.4 s |
Pickleファイルとして書き出し
DataFrameを書き出し。2.4s
1 2 3 4 5 6 7 8 9 |
%%time import pickle with open('example.pickle', 'wb') as f: pickle.dump(df, f, protocol=4) # CPU times: user 326 ms, sys: 848 ms, total: 1.17 s # Wall time: 2.4 s |
Pickleファイルは771MBになりました。容量も削減できますね。
Pickleファイルを読み込み
Pickleファイルを読み込み。1.8s
1 2 3 4 5 6 7 8 9 |
%%time import pickle with open('example.pickle', 'rb') as f: df = pickle.load(f) # CPU times: user 262 ms, sys: 1.12 s, total: 1.38 s # Wall time: 1.8 s |
読み込みだけで比較すると、43.4sから1.8sになりました。
一度巨大データをDataFrameとして読み込んだなら、Pickle化しておくと捗りそうですね。