2015-12-29 44 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的評論。如果對更多人有幫助,我已將此添加到我的答案中。 –