pandasのpickle protocol 5エラーへの対処法

今やっている案件はとりあえず行動ログデータが結構な大きさで、まあまあ頻繁にcolabのメモリがパンクしてインスタンスがクラッシュする。なので下処理だけローカルマシンのAnacondaで済ませてその先をColabでやるという馬鹿みたいな状態になっているのだが、ここでPythonのpickleファイルをColabに読ませようとしたところで、

Error: Unsupported Pickle Protocol 5

のエラーが出て読めなくなった。Pythonのシリアライゼーションことpickleファイルの読み出しエラーは経験したことなかったので(だからこそ信頼しているのだが)結構驚いた。

この問題は日本語だと解決策・解説ともに間違った記事が上がっているのではっきり書いておくと、protocol 5エラーは根本的にpython自体がprotocol 5に対応するのもそもそもPython 3.8からだし、pandasで読み込む際のバージョンの問題でもある。

小難しいことは抜きにして一番楽に対応できるのはprotocol 5のpickleを読み出すためのpickle5パッケージを使うこと。特にColabでProtocol 5を純正の方法で読み出そうと思ったらPythonを3.8に上げて〜とか色々面倒なことが起きる。(Python 3.7 Error: Unsupported Pickle Protocol 5 | stack overflow

ということでとりあえずpipからインストールして

%pip install pickle5

できたら後は呼び出してload関数で読み込むだけなので、

import pickle5
path = ‘dataset.pkl'
with open(path, "rb") as f:
     d = pickle5.load(f)

まあこんな感じで読み出せる。簡単。

ちなみにprotocol 5に対応しているインスタンスからたとえばpandasでpickleを吐き出す際に、protocol 4で保存しようと思ったら、

d = pd.DataFrame()
f = 'data.pkl'
d.to_pickle(f, protocol = 4)

のように引数でprotocolを指定してあげればよい。ただprotocol 5の方が諸々効率がよいので、こちらがデフォルトで使えるようになるに越したことはない。

そんな感じで、このエラーに関してはcolabのpython/pandasが対応してないだけの話(Python 3.8での新機能はこの辺りが詳しい)なので、単純にcolabのPythonが更新され次第解決されるんじゃないのかね。結構長く使っている身としては順次アップデートされているのは事実なので。

念のため2022/01/29現在のcolabの現状としてpythonとpandasのバージョンを見ておく。

!python --version
!pip show pandas

ちなみにcolab上でpandasのバージョンを上げようとすると、

!pip install --upgrade pandas

勝手なことをするなとColabに怒られる。

Colab上で走らせるPythonのバージョン自体を上げる方法もないわけではないもののそこまでやるのも面倒なので割愛。