0

これは私の機能です:

def pickleIt(file_name,data):
   try:
        with open(file_name+".pickle", "wb") as output_file:
            pickle.dump(data, output_file,-1)
        output_file.close()
    except Exception,e:
        print "Cannot open the file:",file_name,e
    return 

辞書やリストをピクルスにするとうまくいきますが、辞書のリストではうまくいきません。別の関数から辞書を取得し、single_recordそれをリストに追加します。

def set_dict(url.....)
     single_record={'url':url,
                    'title':song_obj.getSongTitle(),
                    'name':song_obj.getPerformer(),
                    'author':song_obj.getAuthors(),
                    }
     return single_record

50個のdictのリストをダンプしようとすると、次のエラーが発生します。

maximum recursion depth exceeded

誰かがそれの何が悪いのかを見つけるのを手伝ってもらえますか?

4

1 に答える 1

2

「最大再帰深度を超えました」というエラーは、コールスタックが深すぎることを意味します。呼び出しスタックの深さは、基本的に、最初の呼び出しポイント(メインの関数/ループのようなもの)から戻らずに呼び出された関数の数です。

したがって、たとえば、最初の呼び出しポイントからを呼び出す場合func1()func1()深さは現在1です。戻るfunc1()前に別の関数を呼び出すと、その関数の深さは2になります。

コールスタック呼び出しのサイズに対する現在の制限を確認し、sys.getrecursionlimit()それを変更するには、を呼び出しますsys.setrecursionlimit()

コードをピクルスするときにエラーがスローされた場合は、ピクルスしようとしている構造にネストされた要素が多すぎる可能性があります。これは、ダンプされる構造内のコンテナーでdump/が繰り返されるためです。dumpsつまり、リストをダンプする場合は、リスト内の各要素(それ自体がリストまたはdictである可能性があります)をダンプするため、最初に要素をダンプし、以下同様に続きます。要素のネストが深すぎる場合(リストまたはディクテーションを含むリストまたはディクテーション、リストまたはディクテーションを無限に含む場合)、ある時点で最大再帰深度に達します。

問題は他の場所にある可能性がありますが、それ以上の詳細がなければ、それが原因である可能性がある唯一のことです(実際にそれがエラーがスローされる場合)。

私は1000個のディクト(構造があなたのものと似ています)のリストを選んでみましたが、それはうまくいきました。したがって、ネストされすぎている構造を誤って構築しているか、そのエラーがへの呼び出しでスローされていません。picke.dump()

編集:

この関数を試して、ダンプしようとしている構造がどのようにネストされているかを確認してください。

def nestedness(struct):
    if isinstance(struct, list):
        return max([0] + [nestedness(i) for i in struct]) + 1
    if isinstance(struct, dict):
        return max([0] + [nestedness(i) for i in struct.values()])+1
    return 1

sys.setrecursionlimit()最大再帰深度を超えて失敗した場合は、適切な答えが得られるまで使用して上げ続けます。構造がネストされすぎている場合は、構造を変えることでネストを減らす方法を見つけることができるかどうかを確認してください。

編集:後世のために、空のdictとシーケンスを処理するようにネストを修正しました

于 2013-02-23T22:11:26.890 に答える