luigiって何
データをいろいろ変換するときに、例えば、変換処理Aは変換処理Bに依存して、変換処理Bは変換処理Cに依存する場合、依存関係を調べて変換処理Cから順に処理を実行してくれる便利なライブラリ。
一連の処理の途中でエラーが発生した場合の対応や再実行の際に実行済みの部分はスキップしてくれるなど有能です。
依存関係がない部分は並列処理をしてくれたりもします。
詳しくは、PythonとLuigiによるデータパイプライン構築をどうぞ。
何がエラーになる
並列数を2以上にすると
PicklingError: Can't pickle <function update_tracking_url at 0x0000000001E100B8>: it's not found as luigi.worker.update_tracking_url
といった感じのエラーになります。
multiprocessingとpickleの相性がwindowsに限り悪いようです。良く分かりません。
解決策
luigiのバージョンを1.2.1に下げます。
pipではバージョンを指定しないと、最新版のバージョン2.3.0が入りますが、これが罠です。
追記(2016/8/27)
condaで提供されるバージョンが2.3.0に更新されました。
また、windows向けはこのバージョンしかないようなので、pipでインストールする他ないようです。
anacondaの場合は
conda install luigi
pipの場合は、
pip install luigi==1.2.1
でバージョン1.2.1が入ります。
私の環境ではこれで解決しました。
ただ、Pickle crashing when trying to pickle "update_tracking_url" in luigi.worker?では、バージョン2.0.1に上げると解決したといっている人もいるので、どのバージョンがいいか試す必要があるかもしれません。
バージョン1と2の違いについて 追記(2016/8/27)
パケージに手を加えることを厭わなければ、バージョン2.1.1までは利用できます。
編集内容については、Pickle crashing when trying to pickle "update_tracking_url" in luigi.worker?を参照ください。
バージョン2の方が基本的には高性能なようです。
具体的には、
- 明示的に指定できるパラメータのデータ型の種類が増えた
- グローバルスケジューラのUIがきれいになった。
- グローバルスケジューラのUIで利用できるdependency graphの表示に失敗することがなくなった。
- 私が調べた範囲では、バージョン1の方では、タスクがパラメータを持っていると表示できませんでした。
などが挙げられます。
最後に
marioはオリンピックに行ったのに、嗚呼、luigiよ、かわいそうに。