背景:最小限の構築アルゴリズムを使用して、辞書を表すトライを構築しています。入力リストは4.3Mutf-8文字列で、辞書式に並べ替えられています。結果のグラフは非周期的で、最大深度は638ノードです。スクリプトの最初の行は、を介して再帰制限を1100に設定していますsys.setrecursionlimit()
。
問題:トライをディスクにシリアル化できるようにしたいので、最初から再構築しなくても(約22分)メモリにロードできます。テキストプロトコルとバイナリプロトコルの両方pickle.dump()
で、との両方を試しました。cPickle.dump()
毎回、次のようなスタックトレースを取得します。
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 663, in _batch_setitems
save(v)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 725, in save_inst
save(stuff)
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "/System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/pickle.py", line 648, in save_dict
self.memoize(obj)
RuntimeError: maximum recursion depth exceeded
私のデータ構造は比較的単純です。 trie
開始状態への参照が含まれ、いくつかのメソッドを定義します。 dfa_state
ブールフィールド、文字列フィールド、およびラベルから状態への辞書マッピングが含まれています。
私はの内部動作にあまり精通していませんpickle
-私の最大再帰深度は、いくつかのnのトライの深度のn倍以上/等しい必要がありますか?それとも、これは私が知らない何かによって引き起こされた可能性がありますか?
更新: 再帰の深さを3000に設定しても効果がなかったため、この方法は有望ではありません。
更新2: 皆さんは正しかった。デフォルトの再帰制限のために、ピクルスが小さな入れ子の深さを使用することを想定して、私は近視眼的でした。10,000がトリックを行いました。