将架构更改为x64后,Lucene IndexWriter.AddDocument变慢

问题描述 投票:0回答:1

我有一个使用Lucene.net 3.0.3的asp.net核心Web应用程序,目前正在使用x86架构:

<TargetFramework>net461</TargetFramework>
<RuntimeIdentifier>win7-x86</RuntimeIdentifier>

在将文档写入索引时,过程非常顺利 - 调用IndexWriter.AddDocument只需不到一秒钟,并且没有记录停止。

我们尝试转移到win7-x64,但我们注意到我们的lucene重建索引需要更长的时间。在大多数情况下,调用IndexWriter.AddDocument在x86x64上花费的时间相同。然而,在x64上,每隔几千条记录 - 会有一个文件在IndexWriter.AddDocument上需要15秒!

有关为什么会发生这种情况和/或如何调试和修复它的任何想法?

这就是代码的样子:

private void AddItemToIndex(TInput indexItem, IndexWriter writer)
{
    var searchQuery = new TermQuery(new Term("Id", NumericUtils.IntToPrefixCoded(indexItem.Id)));
    writer.DeleteDocuments(searchQuery);

    var document = GetDocumentsFromIndexItem(indexItem);

    //this is the line that will sometimes take 15 seconds
    writer.AddDocument(document); 
}

private Document GetDocumentsFromIndexItem(LuceneIndexItemDto item)
{
    var indexDocument = new Document();
    indexDocument.Add(new NumericField(nameof(item.Id), Field.Store.YES, true).SetIntValue(item.Id));

    indexDocument.Add(new Field($"{nameof(item.Id)}String", item.Id.ToString(), Field.Store.YES, Field.Index.ANALYZED));
    indexDocument.Add(new Field(nameof(item.Title), item.Title ?? "", Field.Store.YES, Field.Index.ANALYZED));
    indexDocument.Add(new Field(nameof(item.Description), item.Description ?? "", Field.Store.YES, Field.Index.ANALYZED));

    foreach (var note in item.Notes)
    {
        indexDocument.Add(new Field(nameof(item.Notes), note ?? "", Field.Store.YES, Field.Index.ANALYZED));
    }

    return indexDocument;
}

更新1:我开始通过Lucene.net进行调试,我发现当Lucene调用Flush时会发生失速。因此,它的冲洗需要很长一段时间。

c# asp.net-core .net-core lucene lucene.net
1个回答
1
投票

由于你的代码看起来不错,这是建议如何尝试和调试它。

首先,你必须在某处记录Lucene的所有信息,这样你就会知道发生了什么。编写自己的Lucene.Net.Util.InfoStream,并将所有信息写入数据库。这是一个示例,如何使用log4net编写它:

public class Log4NetInfoStream : InfoStream
{
    private readonly ILog _log;

    public Log4NetInfoStream()
    {
        _log = LogManager.GetLogger(GetType());
    }

    public override bool IsEnabled(string component)
    {
        return true;
    }

    public override void Message(string component, string message)
    {
        _log.DebugFormat("{0} :: {1}", component, message);
    }
}

然后当您的程序启动时,将其设置为:

Lucene.Net.Util.InfoStream.Default = new Log4NetInfoStream();

之后,您将能够检查您的应用程序中发生了什么。

如果这没有帮助,请安装Process Monitor,并检查这15秒延迟的确切位置。我有一种感觉,这与Lucene无关,但是你的机器有问题。也许它无法访问某些东西,某些网络驱动器或代理。这个工具会告诉你。

© www.soinside.com 2019 - 2024. All rights reserved.