NumPyの配列、Pythonオブジェクトにしたらめっちゃ重くなってる
特に何も考えず配列を.tolist()
したらメモリ食い尽くしてエラーになっちゃってウケたのでメモ。
正確にはそういうコードを書いたわけではなくて、そういうコードのジョブがエラーになってたのを見つけてしまっただけですが…。
原因
NumPyの配列は内部でCの連続メモリに実際のデータを格納しているので、Pythonオブジェクトとして扱われるために必要な型情報、参照カウント、ポインタ(これはCの構造体を指す)などのヘッダを持っておらず、結果的にかなり軽い状態のままデータを扱える。だいたい1/4くらいになるっぽい(要出典)
なのでPythonオブジェクトに変換した途端に容量が膨れ上がって、最終的に出力されるデータよりも遥かに大きなデータ量を取り扱っていた。
扱ってるデータのサイズと死んだマシンのメモリ容量に乖離あるな~と思ってたけど、これなら死ぬこともありえそう。
明日簡単なコード叩いてどれくらい膨れ上がってるか確認してみる。