芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

numpyならpickleよりもnumpy.save

pickle.dumpしようとしたら,

OverflowError: cannot serialize a bytes object larger than 4 GiB

とエラーが出た.どうやらpickleは4GBのデータまでしか扱えないみたい...

pickleしようとしていたデータはnumpy(以後npと表記)の配列だったので, npのメソッドで同じように保存できるみたい. 試しにやってみるとnpのメソッドなら4GB以上のデータがnpyファイルで保存できた. 中々こんなことはないと思うが, 例えば機械学習器に食わせるデータが膨大ってときはpickleよりもnpのメソッドで保存した方が良い, 良いというよりnpのメソッドでないと扱えない.

んで,そのメソッドがnp.saveとのこと.

  • 保存
    • pickle.dump(4GB以下のデータ,openで開いたファイル)
    • np.save(ファイルパス,numpyデータ)
  • 読み込み
    • pickle.load(openで開いたファイル)
    • np.load(ファイルパス)
      (ファイルパスでなくopenで開いたファイルを指定してもいい)

pickleの場合,with open構文の中で使わないといけないから2行書く羽目になるが, np.saveだと一行で済むので書く手間が省けるナァ~

ただ,npのメソッドで出力したファイルの拡張子は.npyになる. .pickleでもいいみたいだけど,ここは区別して.npyにしたほうがいいだろうな.

また,当然np.savenpのデータ(numpy配列や行列)が対象なので, 例えばscikit-learnとかでそのデータをもとにモデルを作った際にモデルの保存はpickleってことになる. もしかしたらscikit-learnでも保存メソッドがあるかもしれないがここでは触れない.

参考

pickle

techacademy.jp

numpy.save

www.sejuku.net deepage.net www.python-izm.com