2012-06-18 85 views
6

我正在使用一個簡單的Jena數據集,它只導入了一個〜30 MB的RDF文件。作爲應用程序的一部分,我試圖讓用戶查詢默認圖(或命名圖),並將查詢結果中的三元組插入到新的命名圖中。爲此,我使用CONSTRUCT語句形成RDF形式的三元組結果集,然後將這些三元組放入新模型(使用QueryExecution.execConstruct())並將此模型添加到數據集中。這似乎再次起作用,因爲數據集獲取新的圖形節點,並且TDB數據庫文件夾的磁盤大小增大。如何減小TDB支持的耶拿數據集的大小?

當我嘗試從數據集中刪除一個指定圖形時,出現這個問題。使用數據集的removeNamedName(「graphName」)方法,我從數據集中刪除模型。未來對該型號名稱的查詢顯示它已成功刪除。但是,即使在同步和退出之後,TDB數據庫文件夾的磁盤大小仍保持相同大小。

起初我以爲數據庫可能只是將已刪除文件的空間標記爲空白,以便可以在新數據進入時將其覆蓋,但似乎並非如此。如果我刪除一個命名圖並在同一程序運行後立即替換它,該文件夾似乎不會增長,但如果我添加一個新命名圖並在同一運行中刪除它,則文件夾大小會變大,並且模型刪除不會釋放內存,這意味着在幾次運行後,數據庫文件夾是其原始大小的五倍或十倍,而不需要保留更多數據。

任何洞察力或幫助將是偉大的,再次感謝。

回答

6

您可以通過在Jena郵件列表([email protected])上詢問獲得更多的信息,但我會盡力回答。您也可以查看網站上的TDB Architecture頁面。

TDB通過構建它所稱的節點表來存儲數據,它將RDF節點映射爲64位整數ID,反之亦然。然後,它使用這些整數ID構建單獨的索引,從而允許其執行回答SPARQL查詢所需的各種數據庫掃描。

添加數據可能會向這些結構(節點表和索引)添加條目,但刪除數據只會從索引中刪除數據。因此,隨着時間的推移,即使您刪除舊數據,節點表也會繼續增長,因爲它不會從節點表中刪除。

這背後的實際原因是雙重的:

  1. 的整數ID編碼部分文件偏移,因此ID到節點查找因此快速掃描文件作爲數據被刪除,你不能刪除節點的部分表,而不必重寫所有節點ID,即ID - >節點方向上的節點表是一個順序文件(有助於快速插入)
  2. 當數據被刪除時,您不知道節點是否被多次使用而無需進行完整的數據庫掃描。因此,您無法確定是否應首先刪除節點表條目。唯一可行的方法是實施完整的參考計數方案,這本身會增加系統的複雜性並減慢增加和刪除。

免責聲明 - 我在耶拿項目從來沒有做過任何工作,親自TDB組件所以這反映了我最好的理解,可能不完全準確的提交。

+0

非常感謝!我一定會檢查郵件列表,這是一個恥辱,刪除不一定會減少表的大小,但它是可以理解的。再次感謝。 – paul