NumPyの配列、Pythonオブジェクトにしたらめっちゃ重くなってる

特に何も考えず配列を.tolist()したらメモリ食い尽くしてエラーになっちゃってウケたのでメモ。

正確にはそういうコードを書いたわけではなくて、そういうコードのジョブがエラーになってたのを見つけてしまっただけですが…。

原因

NumPyの配列は内部でCの連続メモリに実際のデータを格納しているので、Pythonオブジェクトとして扱われるために必要な型情報、参照カウント、ポインタ(これはCの構造体を指す)などのヘッダを持っておらず、結果的にかなり軽い状態のままデータを扱える。だいたい1/4くらいになるっぽい(要出典)

なのでPythonオブジェクトに変換した途端に容量が膨れ上がって、最終的に出力されるデータよりも遥かに大きなデータ量を取り扱っていた。

扱ってるデータのサイズと死んだマシンのメモリ容量に乖離あるな~と思ってたけど、これなら死ぬこともありえそう。

明日簡単なコード叩いてどれくらい膨れ上がってるか確認してみる。