繁体   English   中英

Saxon内存未释放

[英]Saxon memory not being released

我在释放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中运行代码,因为我们同时进行了许多评估,其中许多评估使用的XML文件最大为2GB。 因此,我们需要尽快执行Build()方法时由Saxon使用的内存,但实际上是垃圾回收器没有完全回收该内存。 每次评估后,内存使用量都会上升并增加,并且永远不会完全释放,因此在进行了几次这样的大型评估后,内存使用量已达到最大值。 我尝试调用TaskDispose()方法,将所有变量设置为null,但似乎没有任何效果。 有什么想法会发生什么吗?

编辑:

谢谢大家的答案。 我意识到这个问题实际上不在撒克逊人的代码中,而是与不释放内存的XmlDocument有关。 对困惑感到抱歉。

检查在任务中使用的实例的任何类是否是可丢弃的,它们是否可以保留资源,直到显式调用dispose(在完成其工作之后)。 using块结帐。

还从官方文档中指出:

应用程序需要做的第一件事是创建一个处理器。 处理器保存Saxon的配置信息以及共享资源,例如名称池和架构池。 如果需要,可以同时运行多个处理器,但是通常单个应用程序中的所有Saxon进程使用同一处理器更为经济。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM