我在这里可能有点过头了,但我正在用 python 做一个小的生物信息学项目。我正在尝试并行化一个分析大量字符串集的程序(RAM 中约 2-3GB)。我发现当我有较小的字典时,多处理版本更快,但几乎没有什么好处,而且对于大字典来说通常更慢。我的第一个理论是内存不足只会减慢一切,而瓶颈在于交换到虚拟内存。但是,我在具有 4*48GB RAM 的集群上运行该程序,并且发生了同样的减速。我的第二个理论是对某些数据的访问被锁定。如果一个线程试图访问当前正在另一个线程中访问的引用,该线程是否必须等待?我已经尝试创建我想要操作的字典的副本,但这似乎非常低效。还有什么可能导致我的问题?
我的多处理方法如下:
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