2

Win 7/SolrNet 0.4.0/C# winforms .net 4.0 クライアント。

Solrnet と winforms スレッド アプリケーションを使用して、複数のビットマップといくつかの数学的記述子を Solr インスタンス (別のサーバー上) に書き込みます。興味深いのは solr.Add メソッドで、アプリの速度が大幅に低下するようです。つまり、add & commit メソッドをコメントアウトすると、CPU 使用率は 90% 程度に跳ね上がりますが、それらが機能している場合、CPU 使用率は約 20% ですが、ドキュメントは Solr に書き込まれているようです。

それは期待される動作ですか?Solrの書き込みがボトルネックになるでしょうか?どうすればそれを回避できますか?

            var doc = new IndexDocument
            {
                _UUID = Guid.NewGuid().ToString(),
                _FileName = (FileName),
             };

            //// Bitmap is not thread safe we Need to make a copy for each Task and done so synchronously.            
            Bitmap[] blobCopies = MakeBlobCopies(bmpBlob, 2);

            Task<List<KeyValuePair<string, double>>>[] descriptorTasks = new Task<List<KeyValuePair<string, double>>>[2];
            descriptorTasks[0] = Task.Factory.StartNew<List<KeyValuePair<string, double>>>(() => ApplyDescriptor1(blobCopies[0]));
            descriptorTasks[1] = Task.Factory.StartNew<List<KeyValuePair<string, double>>>(() => ApplyDescriptor2(blobCopies[1]));

            Task.WaitAll(descriptorTasks);
            foreach (var t in descriptorTasks)
            {
                List<KeyValuePair<string, double>> flds = t.Result;
                foreach (KeyValuePair<string, double> fld in flds)
                {
                    Type type = doc.GetType();
                    if (!String.IsNullOrEmpty(fld.Key))
                    {
                        SetPropertyValue(doc, fld.Key, fld.Value);
                    }
                }
            }

            DisposeBlobCopies(blobCopies);

            solr.Add(doc);
            solr.Commit();
4

1 に答える 1

3

solr 呼び出しは、io ヒットをブロックしているため、アプリのボトルネックになる可能性があります。追加とコミットは、安らかな API に対する 2 つの異なる呼び出しです。solrnet の API で非同期呼び出しをネイティブにサポートしていないことはほぼ間違いありませんが、タスク並列ライブラリの使用方法を知っているようです。通話をブロックしないようにすると、速度が向上します。同時実行の量を制御する必要がある場合があります。

于 2012-07-02T22:57:49.720 に答える