#背景
最近流行のkaggleにチャレンジしてみました
が、特徴量を増やすとデータが巨大になり、「Memory Error!」に悩まされました
それでもkaggleを諦められなかった私は、メモリと上手く付き合う道を模索しました
#[1]環境を変える
そもそもメモリ8GBで挑むことが無謀なので、**「Google Colaboratory」**を利用すると良さそうです
・メモリ : 約13GB
・無料
・ブラウザ上で動く
・面倒な環境構築は一切不要
・一瞬でpython(Jupyter Notebook)環境が手に入る
使い方に関しては下記のリンクが詳しいです
Google Colaboratory事始め
Colaboratoryのデータの入出力まとめ
控えめに言って素晴らしいですね
データの入出力にクセがありますが、慣れてしまえば基本的にはJupyter Notebookをそのまま利用することができます
オマケにGPU環境も無料で手に入るため、使い勝手の良いツールです
#[2]メモリを食っている変数を探し、削除する
変数のサイズは下記で確認できます
import sys
sys.getsizeof(val)
メモリを食っている変数を大きいほうから表示してみます
import sys
import pandas as pd
print(pd.DataFrame([[val for val in dir()], [sys.getsizeof(eval(val)) for val in dir()]],
index=['name','size']).T.sort_values('size', ascending=False).reset_index(drop=True))
name size
0 data 570142137
1 test 90020943
最後に、不要な変数を削除してgcを解放してあげます
import gc
del data, test
gc.collect()
#[3]DataFrameの入出力に「feather」を使う
pickleによる入出力は高速で便利です
が、メモリをかなり食うのが辛いところで、貧弱環境ではメモリエラーになることがあります
かといって単にpd.read_csv
は時間がかかりすぎるという問題があり・・・
回避するためのライブラリは色々あるようですが、 feather を利用すると良さそうです
インストールは下記のコマンドで行えます
!pip install feather-format
肝心のスピードは下記の通り、pandasと比べるとかなり高速です
##入力
%time df = feather.read_dataframe('test.csv')
CPU times: user 78 ms, sys: 49 ms, total: 127 ms
Wall time: 680 ms
%time df = pd.read_csv('test.csv')
CPU times: user 846 ms, sys: 25 ms, total: 871 ms
Wall time: 5.8 s
##出力
%time df.to_feather('test.csv')
CPU times: user 942 ms, sys: 55 ms, total: 997 ms
Wall time: 16.3 s
%time df.to_csv('test.csv')
CPU times: user 6.14 s, sys: 245 ms, total: 6.39 s
Wall time: 1min 11s
#結論
これでkaggleのスタートラインに立てましたね!
(「PC買えよ」というツッコミは、なしでお願いします・・・)