LoginSignup
30
23

More than 5 years have passed since last update.

Python メモリ8GBでkaggleを闘うときに知っておきたいこと

Posted at

背景

最近流行の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買えよ」というツッコミは、なしでお願いします・・・:expressionless:)

30
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
23