我正在使用自动激活将数据存储在多处理设置中。但是,我不知道如何将它合并到多处理管理器功能中。
我的自动激活代码来自Python 中的“collection.defaultdict”的多个级别,并且在没有发生多处理时工作正常。
class vividict(dict):
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
我的 multiproc 代码相对简单:
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))
我尝试了一系列我认为很好的解决方案,但我无法让它发挥作用,除了打电话write_to_file
,insert_ngram
但这并不是一个很好的解决方案。
是否有可能让 Manager.dict() 自动复活?
--------- 2013 年 6 月 12 日更新--------
由于Manager()
提供了代理,manager.Dict()
因此不会存储/跟踪子进程中对 a 的任何突变。(另请参阅:multiprocessing.Manager() 如何在 python 中工作?)这可以通过以下方式解决:
def insert_ngram(sanitize_queue, ngramDict):
localDict = Vividict()
localDict.update(ngramDict)
#do stuff
ngramDict.update(ngramiDict)
我正在等待我的机器完成一些任务,以便查看它的执行情况。像这样上下复制字典似乎对性能造成了影响。(我的字典运行到 200Mb+)
--------- 2013 年 8 月 12 日更新-------- 在我的应用程序中,dict.update() 只被命中一次,所以即使 Dict 是 ~200Mb+,总的来说对性能影响不大...