1

私は周りを見回しましたが、この質問に対する答えを見つけることができませんでした. 私のコードは問題ないと確信していますが、コードを実行してピクルされた結果 (辞書) をディスクに保存すると、使用したコアの数によってサイズが異なることに気付きました。

Using 4 cores results in a file 48,418 KB
Using 8 cores (hyperthreading) results in a file 59,880 KB

結果は同じであるはずです(そして見える)ので、サイズの違いの原因は何かに興味があります。

2 つの pickle オブジェクトを簡単に合計すると、どちらも各辞書に同じ数の項目が報告されます。

4 cores has 683 keys and 6,015,648 values
8 cores has 683 keys and 6,015,648 values

各キーの値がまったく同じであることを確認できると思いますが、実行にはかなり時間がかかると思います。

これを引き起こしている可能性のある唯一のコードは、データをチャンクに分割して処理する場所である必要があります。それらは次のとおりです。

def split_list_multi(listOfLetterCombos,threads=8):
    """Split a list into N parts for use with multiprocessing module. Takes a list(or set)
    which should be the various letter combinations created using make_letter_combinations().
    Divides the list into N (where n is the number of threads) equal parts and returns a dict
    where the key is the thread number and the value is a slice of the list.
    With 4 threads and a list of 2000 items, the results dict would be {'1': [0:500],
    '2': [500:1000], '3': [1000:1500], '4': [1500,2000]} and the number of threads."""
    fullLength = len(listOfLetterCombos)
    single = math.floor(fullLength/threads)
    results = {}
    counter = 0
    while counter < threads:
        if counter == (threads-1):
            results[str(counter)] = listOfLetterCombos[single*counter::]
        else:
            results[str(counter)] = listOfLetterCombos[single*counter:single*(counter+1)]
        counter += 1
    return results,threads


def main(numOfLetters,numThreads):
    wordList = pickle.load( open( r'd:\download\allwords.pickle', 'rb'))
    combos = make_letter_combinations(numOfLetters)
    split = split_list_multi(combos,numThreads)
    doneQueue = multiprocessing.Queue()
    jobs = []
    startTime = time.time()
    for num in range(split[1]):
        listLetters = split[0][str(num)] 
        thread = multiprocessing.Process(target=worker, args=(listLetters,wordList,doneQueue))
        jobs.append(thread)
        thread.start()

    resultdict = {}
    for i in range(split[1]):
        resultdict.update(doneQueue.get())

    for j in jobs:
        j.join()

    pickle.dump( resultdict, open( 'd:\\download\\results{}letters.pickle'.format(numOfLetters), "wb" ) )
    endTime = time.time()
    totalTime = (endTime-startTime)/60
    print("Took {} minutes".format(totalTime))
    return resultdict
4

1 に答える 1

2

From: cPickle - 同じオブジェクトをピクルした 異なる結果 cPickle -同じオブジェクトをピクルした異なる結果

「一見同一のオブジェクトが同一のピクル文字列を生成するという保証はありません。

pickle プロトコルは仮想マシンであり、pickle 文字列はその仮想マシン用のプログラムです。特定のオブジェクトに対して、そのオブジェクトを正確に再構築する複数のピクル文字列 (= プログラム) が存在します。」

ピクルスのディリーについて話してください!

于 2013-02-13T22:49:27.700 に答える