私はここで少し頭を悩ませているかもしれませんが、Python で小さなバイオインフォマティクス プロジェクトに取り組んでいます。文字列セットの大規模な辞書 (RAM で約 2 ~ 3 GB) を分析するプログラムを並列化しようとしています。小さい辞書を使用している場合はマルチプロセッシング バージョンの方が高速ですが、大きな辞書を使用している場合はほとんどメリットがなく、ほとんどが遅いことがわかりました。私の最初の理論は、メモリが不足するとすべてが遅くなり、ボトルネックは仮想メモリへのスワップにあるというものでした。ただし、4*48GB の RAM を搭載したクラスターでプログラムを実行したところ、同じスローダウンが発生しました。私の 2 番目の理論は、特定のデータへのアクセスがロックされていたというものです。あるスレッドが別のスレッドで現在アクセスされている参照にアクセスしようとしている場合、そのスレッドは待機する必要がありますか? 操作したい辞書のコピーを作成してみましたが、しかし、それはひどく非効率的なようです。他に何が問題を引き起こしている可能性がありますか?
私のマルチプロセッシング方法は以下の通りです:
def worker(seqDict, oQueue):
#do stuff with the given partial dictionary
oQueue.put(seqDict)
oQueue = multiprocessing.Queue()
chunksize = int(math.ceil(len(sdict)/4)) # 4 cores
inDict = {}
i=0
dicts = list()
for key in sdict.keys():
i+=1
if len(sdict[key]) > 0:
inDict[key] = sdict[key]
if i%chunksize==0 or i==len(sdict.keys()):
print(str(len(inDict.keys())) + ", size")
dicts.append(copy(inDict))
inDict.clear()
for pdict in dicts:
p =multiprocessing.Process(target = worker,args = (pdict, oQueue))
p.start()
finalDict = {}
for i in range(4):
finalDict.update(oQueue.get())
return finalDict