少し前に、ディスクからのサフィックス ツリーの保存/取得に関する質問を投稿しました。最終的にはうまくいきましたが、今は構築が非常に遅いので、今はウッコネンのアルゴリズム (線形構築) を台無しにしたくありません。
そのため、ツリーをスレッドセーフにすることなくプロセスを高速化するために、同時挿入を行いたいと考えました。
サフィックス ツリーは単語を最初の文字で格納します (私の前の質問に投稿された画像を見てください)。したがって、単語 Banana はルート ノードの 'B' 子にあり、Apple は 'A' 子などになります。 . したがって、'B' で始まる単語を挿入しても、'A' で始まる挿入が妨げられることはありません。私の考えは、挿入される一連の単語の最初の文字ごとにスレッドを作成することです。「A」を挿入するスレッド、「B」を挿入する別のスレッドなどです。
Executer
だから私は、それぞれの単語のキューに単語を追加するだけ
のクラスについて考えていましたProcess
(存在しない場合は最初に作成してください)。
class Executer:
#...
def concurrent_insertion(word):
k = word[0]
processes.get(k, Process()).add(word)
# ...
そして、クラスProcess
は挿入を行うものです。各Process
インスタンスは独立したスレッドであり、Queue
挿入する単語が含まれています。
このProcess
クラスでは、私が問題を抱えている場所です。threading.Thread
各インスタンスはスレッドである必要があるため、から継承する必要があると思いますが、すべてのテキスト処理が完了するまでどうすればそれを維持できますか? つまり、その単語から単語を挿入する必要がQueue
ありますが、Queue
が空の場合、スレッドが終了することはありません。さらに単語がいっぱいになるまで待ち続けてQueue
、「目覚め」、挿入を続けます。