pandasで特に何も考えずにデータを入れて展開していると、結構なメモリを消費します。
pandasのデータサイズと必要なメモリ容量ですが、pandasのデータフレームのサイズは、行数と列数によって決まり、データフレームの各列(カラム)のデータ型によって必要なメモリが異なります。
例えば、int64型は8バイト、float64型は8バイト、bool型は1バイト、object型は可変長で最大値が不明なため、メモリ使用量が大きくなることがあります。
サンプルとして、メモ_国土地理院-全国地名データ(位置参照情報)のcsvデータ(cp932で文字化けあり)をnkfでutf-8に変換してpandasに取り込むまで - 雑学 (hatenablog.com)で整備したデータですと、19627663 entries, 14 columnsで、約2GB(2096MB)でした。
データ型は、object、int64、float64 です。下記のように各セルで8バイト使ってますね。
pandasのデータフレーム展開後のメモリサイズの削減
そこで、数値型のカラムを圧縮してメモリサイズを削減したいと思います。
まず、print(df.max())、print(df.min()) で、カラムの最大値、最小値を確認した後、試しに、「代表フラグ」を int64 から int8 に変換してみます。
df['代表フラグ'] = df['代表フラグ'].astype('int8')
変換後、「代表フラグ」のデータサイズは 157021304 から 19627663 に削減され、メモリサイズも以下のように小さくすることに成功しました。
他のカラムも同様に変換していきます。float64のカラムはfloat32に変換してます。「更新前履歴フラグ」、「更新後履歴フラグ」だけは、 最小値が 0 、最大値が 3.0 なので、float16にしました。きちんと前処理すればbool型にできそうですが。
結果、メモリサイズは 約1.2GB(1235MB)まで小さくなりました。