2

Win 7/SolrNet 0.4.0/C# winforms .net 4.0 客户端。

我正在使用 Solrnet 和 winforms 线程应用程序将多个位图和一些数学描述符写入 Solr 实例(在不同的服务器上)。有趣的是 solr.Add 方法似乎显着减慢了应用程序的速度。即,如果我注释掉添加和提交方法,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 命中。Add 和 commit 是对 restful api 的 2 个不同的调用。我几乎可以肯定 solrnet 在他们的 api 中没有原生支持来进行异步调用,但看起来你知道如何使用任务并行库。使呼叫无阻塞,事情应该会加快。您可能会发现有必要控制并发量。

于 2012-07-02T22:57:49.720 回答