2017-10-20 3 views
0

要件:データ構造が予測順序どおりに分割されるアルゴリズム

私はSolrインデックスを構築するプログラムに機能を追加します。システムはマルチスレッドであるため、検索エントリは毎回ランダムな順序で作成されます。ユーザーが1つの大きなファイルをアップロードしようとすると、サーバーのメモリが不足する可能性があるため、Solrインデックスも複数のファイルに分割する必要があります。

問題:

信頼性の高いシステムを維持し、全体的に物事を簡単にするために、結果としてSolrのインデックスファイルには関係なく、彼らが中で処理しているものの順序と同じになることはありませ必要があるインデックスがバランスする必要があります。ファイル全体にわたって(またはバランスがとれるように十分に近い)、最大限のエントリ数を持つことができます。ファイルが最大エントリ数を超える場合は、ファイルを分割する必要があります。これらのファイルは実行中にも更新されるため、エントリが追加、削除、変更されます。

私は、これらの要件のために採用することができるアルゴリズムを探しています:必要なもの

。私はある種のBツリーが必要だと思いますが、この特定の要件を満たすBツリーの変種についてはわかりません。

これらの要件に役立つアルゴリズムまたはデータ構造がありますか?

+0

「Solrインデックスファイルは同じである必要があります」とはどういう意味ですか?処理される順番にかかわらず、ファイルは同一でなければならないということですか?または、ファイルの内容が一度読み込まれて処理されたら、同じ結果を作成する必要がありますか? –

+0

デフォルトのLuceneインデックスファイルは追加のみであるため、異なる順序でファイルを追加すると、異なるファイルが作成されます(内部のdocidも異なる)。独自のコーデックを作成して、コンテンツを直列化および非直列化することができます。あなたはこれらの要件を満たしていますか?あなたはSolrの外で自分自身でLuceneインデックスを構築していますか?それをどのように構築していますか?ディスク上とメモリ上に構造を作成し、その構造をLuceneに順番に直列化できますか?その場合、各スレッドにバイナリツリーを作成し、それをディスクにマージします。 – MatsLindh

+0

「Solrインデックスファイルは同じである必要があります」というのは、ファイル自体が同一でなければならないということです。これらの要件は、プログラムの信頼性と完全性を証明することです。 Solrのインデックスがどのように作成されているのか分かりません。しかし、これらのファイルはJSON形式になると言えます。しかし、結果として得られるファイルが一貫している限り、ディスクやメモリに構造を作成することができます。 – user489481

答えて

0

内容に基づいてUUIDを使用してください。ファイルを分割するには、UUIDが入る範囲に基づいて各項目をバケットに送ります。どのような順序で項目を取得しても、比較的均等なサイズのバケットに確実に送信され、ユニークなインデックスは結果同じように出てくる。

さらに詳しいアドバイスについてはhttps://wiki.apache.org/solr/UniqueKeyを、その他の役に立つヒントについてはhttps://wiki.apache.org/solr/LargeIndexesを参照してください。

関連する問題