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