2013-04-13 5 views
6

を超えました各セルはその隣にポインタを持ちます。この特定のCAでは、256個のセルがある。さて、ピックラーはすでにピクルされたオブジェクトを認識できるはずです。のpython Picklerさん再帰の深さは、私は私のセルオートマトンクラスのインスタンスを酸洗しようとしているが、私はこのエラーを取得

From docs:
*The pickle module keeps track of the objects it has already serialized, so that later references to the same object won’t be serialized again.

私は実際にはわからないのですが、なぜ最大再帰深度を超えているのですか?

ピックラーは深さ優先酸洗を行っているので、最初にポインタをたどり、再帰スタックを超過して例外を発生させると思います。私はsys.setrecursionlimit()で最大再帰深度を拡張できることを知っていますが、その優れた拡張性のあるソリューションは考慮しません。

最初の質問:pickler depth-first pickling?
第2質問:どのようにこの例外を防止するか考えていますか?

+0

投稿できるコードはどれですか? –

+0

はい、 'pickle'は深さ優先です。残念ながら、私はこの周りにはないと思う。 'cPickle'を試してみてくださいが、おそらく同じエラーが出ます。 –

+0

@AswinMurugesh実際に私は投稿するにはあまりにも多くのコードを持っています。あなたが興味を持っている場合は、ここにいくつかのキーファイルがあります: [近所](https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/lattices/neighbourhoods.py) [セル](https:///github.com/mirobeka/cellular-automata/blob/master/cellular_automata/cells/regular.py#L21) [酸洗](https://github.com/mirobeka/cellular-automata/blob/master/cellular_automata/) lattices/equiangular.py#L210) Exp:cPickleは同じです、私は前にそれを試しました。私はこの答えを恐れていた –

答えて

6

@ExPのように、ピックラーは深さ優先の酸洗いを行い、再帰超過例外を引き起こします。とにかく、私はこの問題の解決策をここに見つけましたbugs.python.org。つまり、python 3.1 picklerはグラフなどの再帰的なデータでも機能します。

再帰的なデータをピクルするのに多くの時間がかかりますが、それほど洗練されていないソリューションもありますが、シンプルです(コードの数行で問題はありません)。リンクhere

おそらく、ゆっくりとpython3に向かって動くようになるでしょう。誰かがこの答えを見つけてくれることを願っています。

+0

http://bugs.python.orgの修正プログラムを使用すると/ issue2480、pythonファイルnonrecursivepickler-fixed.pyをもう一方のファイルに使用してください。 また、このピックルソリューションはバニラピックルよりも圧縮率が低いので、ピクルファイルは大きくなります。 解決していただきありがとうございます。 – kevin948

+2

このissue2480のバージョンは動作しますが、list.pop(0)とlist.extendを使用するため、大きな構造体では非常に非効率です。私の大きなデータ構造では、ピクルに10時間かかっていました。 dequesを使用するように書き直すと、4分に短縮されました。 – strubbly

関連する問題