我觉得这是一个很好的问题并没有提供太多的信息,所以我会尽量回答我自己更换所有声明。
下面是关于如何使用撒克逊一个例子:丢弃文档:
declare function local:doStuffInDocument($doc as document-node()) {
$doc//testPath
};
let $urls := ("http://url1", "http://url2")
let $results :=
for $url in $urls
let $doc := saxon:discard-document(doc($url))
return local:doStuffInDocument($doc)
return $results
通过使用类似的代码我设法从4 + GB减少内存消耗仅300MB。
要了解丢弃文档呢,这里是从迈克尔·凯极大评论发现在SF maillist:
只是为了解释什么丢弃文档()的作用:
撒克逊维持(由变压器/控制器拥有)表 将文档URI映射到文档节点。当您调用文档() 函数时,Saxon会查看该表是否在该表中,并且如果它是 ,它将返回相应的文档节点。如果不是,则它读取 并分析在该URI处找到的资源。 saxon:discard-document()的效果是删除 这个映射表中的文档条目。 (当然,如果从这个 表中引用一个文档,那么垃圾收集器将把文档保存在内存中;如果 它没有从表中引用,那么它就有资格获得 垃圾收集。它引用从一个全局变量 ;但它仍然会从表不存在于 上文件()另一个电话再次使用相同的URI事件)
而且从迈克尔·凯另一个发现在Altova maillist:
In S如果使用doc()或document()函数,那么文件 将被加载到内存中,并且将保留在内存中,直到 运行结束,以防万一它再次被引用。所以你会遇到与大量小文件一样的 内存问题,因为一个大文件 - 实际上更糟糕,因为每个文件的开销很大。
然而,有一个变通方法:一个扩展函数 撒克逊:丢弃文档()一种使文件从 存储器由垃圾收集只要没有更多 引用它被丢弃。
我发现这个链接:http://www.altova.com/list/xsl-list/200501/msg1000132384.html 并通过使用这种方式的内存使用下降了很多。但任何更多的信息将有助于使用此命令 –