メモ_pandasのデータサイズと必要なメモリ容量、メモリサイズの削減について

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)まで小さくなりました。