撒克逊人的记忆没有被释放

时间:2016-05-12 23:45:48

标签: c# xml performance xquery saxon

我在释放内存方面遇到问题,Saxon正在使用该文件将文件加载到内存中。这是我们的代码的简化版本:

Task newTask = Task.Run(() =>
{
    Processor processor = new Processor();
    DocumentBuilder documentBuilder = processor.NewDocumentBuilder();
    documentBuilder.IsLineNumbering = true;
    documentBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
    XQueryCompiler compiler = processor.NewXQueryCompiler();
    string query = BuildXqueryString();

    if (!String.IsNullOrEmpty(query))
    {
        XQueryExecutable executable = compiler.Compile(query);
        XQueryEvaluator evaluator = executable.Load();
        evaluator.ContextItem = documentBuilder.Build(xmlNode);
        var evaluations = evaluator.Evaluate();
    }
}

我们正在Task内部运行代码,因为我们正在同时进行大量的评估,其中许多都使用最大2GB的XML文件。出于这个原因,我们需要Saxon在执行尽快发布的Build()方法时使用的内存,但是发生的事情是垃圾收集器没有完全回收内存。在每次评估之后,内存使用量会上升和上升,并且永远不会被完全释放,因此通过几次大的评估,内存使用率会上升到最大值。我尝试调用Dispose() Task方法,将所有变量设置为null,但似乎没有任何效果。有什么想法会发生什么?

编辑:

谢谢大家的回答。我意识到这个问题实际上并不在Saxon代码中,而是在XmlDocument中没有释放内存。对不起,感到困惑。

1 个答案:

答案 0 :(得分:0)

检查在任务中使用的任何类的任何类是否是一次性的,它们可能持有资源,直到显式调用dispose(在完成其工作之后)。还要结帐using块。

另请注意official documentation

  

应用程序需要做的第一件事是创建一个处理器。   处理器保存Saxon的配置信息并共享   名称池和模式池等资源。它可以运行   如果需要,可以同时使用多个处理器,但通常更多   在单一应用中使用所有Saxon工艺都是经济的   相同的处理器。

那么如何为所有任务使用相同的处理器实例呢?如果它使用缓存资源,它可以提供帮助。