gpt4 book ai didi

python - 在 python 中自动激活多处理管理器()字典

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:53 24 4
gpt4 key购买 nike

我正在使用 autovivification 在多处理设置中存储数据。但是,我不知道如何将它合并到多处理管理器功能中。

我的自动激活代码来自Multiple levels of 'collection.defaultdict' in Python并且在没有多处理发生时工作正常。

class vividict(dict):  
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value

我的多进程代码相对简单:

if __name__ == "__main__":
man = Manager()
ngramDict = man.dict()
print(ngramDict) # {}
s_queue = Queue()

aProces = Process(target=insert_ngram, args=(s_queue,ngramDict,))
aProces.start()
aProces.join()
print(ngramDict) # {}
write_to_file()

在 insert_ngram 中,字典被读取、写入和更新:

def insert_ngram(sanitize_queue, ngramDict):
ngramDict = Vividict() # obviously this overwrites the manager
try:
for w in iter(s_queue.get, None):
if ngramDict[w[0]][w[1]][w[2]][w[3]][w[4]]:
ngramDict[w[0]][w[1]][w[2]][w[3]][w[4]]+=int(w[5])
else:
ngramDict[w[0]][w[1]][w[2]][w[3]][w[4]]=int(w[5])
print(ngramDict) # prints the expected ngramdict
return
except KeyError as e:
print("Key %s not found in %s" % (e, ngramDict))
except Exception as e:
print("%s failed with: %s" % (current_process().name, e))

我已经尝试了一系列我认为很好的解决方案,但我无法让它工作,除了在 insert_ngram 中调用 write_to_file 但事实并非如此确实是一个巧妙的解决方案。

是否有可能让 Manager.dict() 自动生成?

-------- 2013 年 6 月 12 日更新 --------

由于 Manager() 提供代理,因此不会存储/跟踪子进程中对 manager.Dict() 的任何更改。 (另请参阅:How does multiprocessing.Manager() work in python?)这可以通过以下方式解决:

def insert_ngram(sanitize_queue, ngramDict):
localDict = Vividict()
localDict.update(ngramDict)
#do stuff
ngramDict.update(ngramiDict)

我正在等待我的机器完成一些任务,这样我就可以看到它的性能如何。像这样上下复制 Dicts 似乎会影响性能。 (我的 Dicts 达到了 200Mb+)

-------- 2013 年 8 月 12 日更新 --------在我的应用程序中,dict.update() 只被命中一次,所以即使 Dict 是 ~200Mb+,总的来说它对性能影响不大......

最佳答案

多处理 Manager() 提供字典或列表的代理。子进程中 manager.Dict() 的任何变更都不会被存储/跟踪。因此需要将突变复制到属于管理器的代理变量。(另请参阅:How does multiprocessing.Manager() work in python?)

可以通过以下方式解决:

def insert_ngram(queue, managerDict):
# create a local dictionary with vivification
localDict = Vividict()
# copy the existing manager.dict to the local dict.
localDict.update(managerDict)
#do stuff
# copy the local dictionary to the manager dict
managerDict.update(localDict)
return

虽然这似乎是一些严重的开销,但在这种情况下还不算太糟糕,因为管理器字典只需要在加入主进程之前更新()。

关于python - 在 python 中自动激活多处理管理器()字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com