2017-01-10 1 views
-3

私は、迅速な処理と大量のデータを含むプログラミング課題に取り組んでいます。私は、数値範囲の可能な順列のリストを生成し、それらを検索しようとしています。127ミルのエントリーで13ギガのラムを取り上げる:どのように?

コード:

def generate_list(numA, numB): 
    combo = list(range(0, numB)) 
    permutation_list = list(itertools.permutations(combo, numA)) 
    print("initial dictionary length: " + len(permutation_list)) 

問題はAが6であり、Bが25のとき、私のプログラムは非常に遅くなり、RAMの膨大な量を占めるということです。それは約13ギグで覗いた。リストの長さはおよそ127ミルであり、各オブジェクトの長さは6です。これは約750メガのメモリで、13ギガではありません。どうしたの?

編集:データは単なる数字です。 [[0,1,2,3,4,5]、[0,1,2,3,4,6]、...]

+0

どの挑戦ですか?説明とデータにアクセスする方法はありますか? – ppasler

+0

データは単なる数値です。だから[[0,1,2,3,4,5]、[0,1,2,3,4,6]、...] – Smipims

+0

私は誤りを起こした。私が辞書をタイプしたところでリストを意味しました – Smipims

答えて

2

リストまたはタプルの各要素はポインタです。また、4バイトまたは8バイトのいずれかのサイズを持ちます。以下は後者を前提としています。リストのポインタを数えるだけで、タプルは使用されている領域の半分を占めます。残りの部分は約48バイトのオブジェクトヘッダーである可能性があります。これにより、次の式が得られます。

(48+8+(8*6)) * 127000000 == 13208000000 

これは約13ギガバイトです。

完全な置換を避けるために可能なことはすべて実行することをお勧めします。

+0

ありがとうございます!私は別の方法でそれをやらなければならないと考えていましたが、失敗した理由だけを知ることは常に良いことです。 – Smipims

-1

次のように出力順列のリスト全体があるかもしれないかもしれない方法の例:

import itertools 

def combo(b): 
    for combination in range(0, b): 
     yield combination 

def generate_list(numA, numB): 
    for l in itertools.permutations(combo(numB), numA): 
     yield list(l), len(l) 

if __name__ == '__main__': 
    total_length = int() 
    with open('permutations', 'w+') as f: 
     f.write('[') 
     for permutation in generate_list(6, 25): 
      data, length = permutation 
      total_length += length 
      f.write(str(data) + ', ') 
     f.write(']\n') 
    print("initial dictionary length: " + str(total_length)) 

私は2つの別々の発電機にあなたのコードになってきました。組み合わせを与えるもの、順列を与えるもの。

MemoryErrorを使わないで全体を計算し、ファイルに書き込むことができます。 A 非常に大きなファイル。または、それをstdoutに印刷するだけでよいのです。

また、最後に長さを教えてくれます。大量のメモリを必要とせずに終了します。

関連する問題