0

私は最短経路についてデータベースにいくつかの要求を行いますが、非常に頻繁に同じものです (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さらに、複数のプロセスで同時に (または少なくとも問題を発生させずに)読み取り、必要に応じてダンプを同時に変更せずに順次変更できるようにコードを適応させるにはどうすればよいでしょうか?

4

0 に答える 0