1

Solr for Windows が大量のメモリを必要とするのはなぜですか?

Solr の私のデータは、SEO キーワード (1 ~ 10 語、最大 120 シンボルの長さ、8 億行) とその他のデータです。スキーマは次のとおりです。

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="suggests" version="1.5">
<copyField source="suggest" dest="suggest_exact"/>

<types>
    <fieldType name="text_stem" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.SnowballPorterFilterFactory" language="Russian" />
        </analyzer>
    </fieldType>
    <fieldType name="text_exact" class="solr.TextField" positionIncrementGap="100">
        <analyzer>
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
</types>
<fields>
    <field name="suggest" type="text_stem" indexed="true" stored="true"/>
    <field name="suggest_exact" type="text_exact" indexed="true" stored="false"/>
    <field name="length" type="int" indexed="true" stored="true"/>
    <field name="position" type="int" indexed="true" stored="true"/>
    <field name="wordstat1" type="int" indexed="true" stored="true"/>
    <field name="wordstat3" type="int" indexed="true" stored="true"/>
    <field name="ln" type="int" indexed="true" stored="true"/>
    <field name="wc" type="int" indexed="true" stored="true"/>
 </fields>

Solr for Windows は最大 10 GB の RAM を消費し、場合によってはそれ以上 (最大 16 GB) 必要になります。使用するように構成しSOLR_JAVA_MEM=-Xms8192m -Xmx16384mて動作しますが、4 GB 以下の場合、Java がエラー OutOfMemory でクラッシュしました。

それで、私は何を間違っていますか?RAM を減らすように Solr を構成するにはどうすればよいですか? のどの部分でも提供できますsolrconfig.xml

solrconfig.xml

<query>
    <maxBooleanClauses>1024</maxBooleanClauses>
    <filterCache class="solr.FastLRUCache"
                 size="512"
                 initialSize="512"
                 autowarmCount="0"/>
    <queryResultCache class="solr.LRUCache"
                     size="512"
                     initialSize="512"
                     autowarmCount="0"/>
    <documentCache class="solr.LRUCache"
                   size="512"
                   initialSize="512"
                   autowarmCount="0"/>
    <cache name="perSegFilter"
      class="solr.search.LRUCache"
      size="10"
      initialSize="0"
      autowarmCount="10"
      regenerator="solr.NoOpRegenerator" />

    <enableLazyFieldLoading>true</enableLazyFieldLoading>

    <queryResultWindowSize>20</queryResultWindowSize>

    <queryResultMaxDocsCached>200</queryResultMaxDocsCached>

    <useColdSearcher>false</useColdSearcher>

    <maxWarmingSearchers>2</maxWarmingSearchers>

</query>

だから、私が正確に何をしたいのか。

Solr に 8 億行を追加しました。それだけではありません。30 億行のデータセットがあります。行は、「就職活動」「ニューヨークで仕事を探す」などの SEO キーワードです。「提案」フィールドには、「仕事」や「ダウンロード」など、よく使われる同じ単語が多数含まれています。「ダウンロード」という単語は、全行の 10% に存在すると思います。

ユーザーが「ダウンロード」のようなクエリを作成し、「ダウンロード」という単語を含むすべてのドキュメントを取得できるサービスを作成します。

サービスの Web インターフェイス (PHP+MySQL) と Solr の間で通信するためのデスクトップ ソフトウェア (.NET) を作成しました。このソフトウェアは、Web サービスからタスクを取得し、Solr にクエリを実行し、Solr の結果をダウンロードしてユーザーに提供します。

すべての結果を取得するには、次のように GET クエリを Solr に送信します。

http://localhost:8983/solr/suggests2/select?q=suggest:(job%20AND%20new%20AND%20york)&fq=length:[1%20TO%2032]&fq=position:[1%20TO%2010]&fq=wc:[1%20TO%2032]&fq=ln:[1%20TO%20256]&fq=wordstat1:[0%20TO%20*]&fq=wordstat3:[1%20TO%20100000000]&sort=wordstat3%20desc&start=0&rows=100000&fl=suggest%2Clength%2Cposition%2Cwordstat1%2Cwordstat3&wt=csv&csv.separator=;

ご覧のとおり、私は fq と並べ替えを使用し、グループ化は使用していません。誰かが Solr のクエリやアプローチの間違いに気づいたかもしれません。それについて教えてください。ありがとう。

4

1 に答える 1

1

DocValues がオンになっていない TrieIntField を並べ替えています。つまり、Solr は値のコピーをヒープに保持します。800M の値を使用すると、それだけで 3.2GB のヒープになります。-field を設定docValues="true"してwordstat3インデックスを再作成すると、パフォーマンスが多少低下しますが、その要件が大幅に低下します。

Solr (実際には Lucene) は、1 つのシャードで 20 億を超えるドキュメントをサポートしていないことに注意してください。それは厳しい制限です。30 億のドキュメントを同じ論理インデックスにインデックス化することを計画している場合は、マルチシャードの SolrCloud を使用する必要があります。

于 2015-12-08T09:36:22.430 に答える