0

免責事項 (後で追加): 以下の @jasonharper および @user2357112supportsMonica のコメントを考慮してコードを変更しました。まだメモリの問題があります。

次のコードを実行しています。

import itertools
from tqdm import tnrange
import random

def perm_generator(comb1, comb2):
    seen = set()
    length1 = len(comb1)
    length2 = len(comb2)
    while True:
        perm1 = tuple(random.sample(comb1, length1))
        perm2 = tuple(random.sample(comb2, length2))
        perm_pair = perm1 + perm2
        if ( (perm_pair not in seen) ):
            seen.add(perm_pair)
            yield [perm1,perm2]            


seq_all = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V') 
combinations_first_half = list(itertools.combinations(seq_all, int(len(seq_all)/2)))

n = 1000
random.seed(0)
all_rand_permutations = []
for i in tnrange(len(combinations_first_half), desc = 'rand_permutations'):
    comb1 = combinations_first_half[i]
    comb2 = tuple(set(seq_all) - set(comb1))
    gen = perm_generator(comb1,comb2)
    rand_permutations = [next(gen) for _ in range(n)]
    all_rand_permutations += rand_permutations

for ループのほとんどすべての反復で、1 秒あたり約 33 回の反復ですべてがスムーズに進みます。

ただし、まれに、ループがスタックして、かなりの数秒間メモリ不足が発生し始めることがあります。最終的に、特定の後の反復でカーネルが停止します。

random.sample()カーネルが停止する反復またはメモリ負荷の高い反復の 1 つに関連するインデックスからループを開始した場合 (したがって、何らかの形で結果的に をシフトするrandom.seed())、問題はなく、ループが通過するため、関連しているようです。他の高速反復と同様です。

ここにいくつかのスクリーンショットを添付します。

高いメモリ負荷を構築する反復

問題のない繰り返し

カーネルが死ぬ反復

4

0 に答える 0