我向数据库提出了几个关于最短路径的请求,通常是相同的(76 次迭代,每次迭代有 10'000 到 20'000 个请求;我运行了几次,差异很小,但大多是相同的起点和终点最短路径)。所以我创建了一个缓存。我的缓存是一本字典。
with open('path_to_OD_dict', 'rb') as file:
my_unpickler=pickle.Unpickler(file)
OD_dict = my_unpickler.load()
出发地和目的地用 5 位数字编码。如有必要,我用零填充它们,然后将它们放在一起(我们有 origin_route <destination_route):
origin_route = str(origin_route).zfill(5)
destination_route = str(destination_route).zfill(5)
key = origin_route + destination_route
然后我只是尝试找到我刚刚在我的字典中构建的这个键。如果它存在,我直接拥有我的价值。
try:
result = OD_dict[key]
否则,我请求最短路径并将其添加到字典中:
except:
result = shortestPathLength(origin_route, destination_route)
OD_dict[key] = result
with open('path_to_OD_dict', 'wb') as file:
my_pickler=pickle.Pickler(file)
my_pickler.dump(OD_dict)
在线OD_dict[key] = result
我有错误TypeError: 'str' object does not support item assignment
。
我也在用Multiprocessing
。我很可能只是试图同时访问OD_dict
多个进程。
results = []
po = multiprocessing.Pool()
for item in aSet:
results.append(po.apply_async(aBiggerFunctionWithShortestPathInIt))
po.close()
po.join()
for r in results:
myResult.add(r.get())
为什么我会收到此特定消息?(类型错误)
另外,我应该如何调整我的代码以能够同时读取OD_dict
多个进程(或至少不会产生问题),并在必要时按顺序修改它,而不同时修改转储?