2015-12-29 40 views
1

我想找到一个关于如何使用撒克逊的丢弃文档函数的例子。我有大约50个文件每个40MB,所以他们在我的xquery脚本中使用了大约4,5GB的内存。使用撒克逊和xquery的丢弃文档

在每次调用XML文件后,我都试过使用saxon:discard-document(doc("filename.xml")),但是这可能不是正确的方法吗?使用该功能后,内存使用情况没有差异。

我还发现一些关于它的用法(7年前)的问题,他们建议使用discard-document来运行xpath。但我有许多调用该文件,所以我将不得不saxon:discard-document(doc("filename.xml"))/xpath/etc/etc/etc

感谢

+0

我发现这个链接:http://www.altova.com/list/xsl-list/200501/msg1000132384.html 并通过使用这种方式的内存使用下降了很多。但任何更多的信息将有助于使用此命令 –

回答

2

我觉得这是一个很好的问题并没有提供太多的信息,所以我会尽量回答我自己更换所有声明。

下面是关于如何使用撒克逊一个例子:丢弃文档:

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()函数,那么文件 将被加载到内存中,并且将保留在内存中,直到 运行结束,以防万一它再次被引用。所以你会遇到与大量小文件一样的 内存问题,因为一个大文件 - 实际上更糟糕,因为每个文件的开销很大。

然而,有一个变通方法:一个扩展函数 撒克逊:丢弃文档()一种使文件从 存储器由垃圾收集只要没有更多 引用它被丢弃。

1

理解封面下面实际发生的情况可能很有用。 doc()函数在缓存中查找文档是否已经存在;如果不是,它读取文档,将其添加到缓存中,然后将其返回。 discard-document()函数会查看文档是否在缓存中,如果是,则将其删除,然后将其返回。通过从缓存中删除文档,当文档不再被引用时,它使其有资格进行垃圾回收。如果使用discard-document对内存消耗没有影响,那可能是因为还有别的东西仍在引用文档 - 例如全局变量。

+0

嗨迈克尔和感谢您的时间。我已经找到(并保存以供将来参考),您对SourceForge maillist的评论。如果对更多人有帮助,我已将此添加到我的答案中。 –