1

申し訳ありませんが、別の初心者のクエリ:| ここで与えられた提案に基づいて、 最適化する

辞書を段階的に構築できる必要があります。つまり、forループ内で一度に1つのキー:値を作成できる必要があります。具体的には、ディクショナリは次のようになります(Nキー、各値はリストのリストです。小さい方の内部リストには3つの要素があります)。

dic_score ={key1:[ [,,], [,,], [,,] ...[,,] ], key2:[ [,,], [,,], [,,] ..[,,] ] ..keyN:[[,,], [,,], [,,] ..[,,]]}

このdicは、ネストされたforループである次のパラダイムから生成されています。

for Gnodes in G.nodes()       # Gnodes iterates over 10000 values 
    Gvalue = someoperation(Gnodes)
    for Hnodes in H.nodes()   # Hnodes iterates over 10000 values 
        Hvalue =someoperation(Hnodes)
        score = SomeOperation on (Gvalue,Hvalue)
        dic_score.setdefault(Gnodes,[]).append([Hnodes, score, -1 ])

次に、これらのリストを並べ替える必要がありますが、その答えはここで与えられました。 最適化(内部ループの代わりにジェネレータ式を使用することはオプションです)
[dicには10000個のキーが含まれ、各キーは10000個の要素に関連付けられます。小さいリストの]

ループカウンターが大きいため、生成される辞書が巨大になり、メモリが不足しています。

辞書全体をメモリに保持する必要がないように、ファイルに生成されたらすぐにKey:value(リストのリスト)を書き込むにはどうすればよいですか。次に、同じ形式、つまりdic_score_after_reading [key]のような形式で辞書を読み戻すことができるようにしたいので、探しているリストのリストを返します。

key:valueごとにこの書き込みと読み取りを行うと、メモリ要件が大幅に緩和されることを期待しています。これを行うためのより良いデータ構造はありますか?おそらくBuzhugのような、各キーに関連付けられたリストにアクセスして反復する柔軟性を提供するデータベースを検討しますか?

現在、cPickleを使用して辞書全体をダンプし、load()を介して読み戻していますが、このようなビッグデータを一度にダンプしているときにcPickleがクラッシュします。

申し訳ありませんが、私はこの種のことを行うためのベストプラクティスを知りません。ありがとう !

4

1 に答える 1

1

含まれている実装と組み合わせてZODBを使用することを検討できます。BTrees

これにより、個々のエントリを個別にオブジェクト ストアに書き込むマッピングのような構造が得られます。セーブポイントまたは単純なトランザクションを使用してデータをストレージにフラッシュする必要がありますが、この方法で大量のデータを処理できます。

于 2012-06-27T19:26:12.453 に答える