2

私は膨大な数のアイテムの組み合わせ (League of Legends から) を処理しています。約 7,200 万通りあり、それらはすべて、それらがどれほど有益であるかを計算する関数に入力されます。

可能な限り最高の組み合わせを見つけようとしています。

アルゴリズム的に言えば、これを行うためのより良い方法があるかもしれないという事実を無視して、メモリエラーが発生する理由を誰か教えてもらえますか?

allpossiblei = itertools.combinations(items.keys(),5)
maxc = 0
i = 0
for combo in allpossiblei:
    icombo = [items[name] for name in combo]
    res, tcost = calcStats(icombo, 0.658,100,100)
    if res > maxc :
        maxc = res
        print str(res) + " " + str(res/tcost)
        print combo
        print float(i)/79208745.0
    if i % 500000 == 0:
        print str(float(i)/79208745.0) + "\n \n"
        gc.collect()
    i = i + 1

calcStats は、ローカル変数を使用した算術演算以外は何もしません。

これは急速に 2 GB 以上のメモリを消費し、約 5 分で終了します。itertools は大量のメモリを消費しないジェネレーターを提供するはずだと思っていましたか? その gc.collect() ステートメントを投入しましたが、うまくいかないようです。何か案は?

4

1 に答える 1

0

組み合わせは、提供されたイテレータ全体を消費してプールを作成します。それを回避する方法はありません。関数のドキュメントの疑似コードを参照してください: http://docs.python.org/library/itertools.html#itertools.combinations

于 2011-11-24T07:40:05.460 に答える