如何减小TDB支持的Jena Dataset的规模?

时间:2012-06-18 17:36:47

标签: java database sparql jena arq

我正在使用一个简单的Jena数据集,该数据集只导入了一个~30 MB的RDF文件。作为应用程序的一部分,我试图让用户查询默认图形(或命名图形),并将查询中生成的三元组插入到新的命名图形中。为此,我使用CONSTRUCT语句以RDF形式构成三元组的结果集,然后将这些三元组放入新模型(使用QueryExecution.execConstruct())并将此模型添加到数据集中。这似乎再次起作用,因为数据集获得了一个新的图形节点,并且TDB数据库文件夹的磁盘大小也在增大。

当我尝试从数据集中删除命名图时,会出现问题。使用数据集的removeNamedName(“graphName”)方法,我从数据集中删除模型。对该模型名称的未来查询表明它已成功删除。但是,即使在同步和退出后,TDB数据库文件夹的磁盘大小仍保持相同的大小。

起初我认为数据库可能只是将已删除文件的空间标记为空闲,以便在新数据进入时可以覆盖它,但似乎并非如此。如果我删除一个命名图并在同一个程序运行后立即替换它,该文件夹似乎没有增长,但如果我添加一个新的命名图并在同一个运行中删除它,文件夹大小会变大,模型删除不会释放内存,这意味着在几次运行后,数据库文件夹的大小是其原始大小的五倍或十倍,而不再保留任何数据。

任何见解或帮助都会很棒,再次感谢。

1 个答案:

答案 0 :(得分:6)

您可以通过询问Jena邮件列表(users@jena.apache.org)获得更多洞察,但我会尝试回答。您可能还希望查看网站上的TDB Architecture页面。

TDB通过构建所谓的节点表来存储数据,节点表将RDF节点映射为64位整数ID,反之亦然。然后,它使用这些整数ID构建单独的索引,这允许它执行回答SPARQL查询所需的各种数据库扫描。

添加数据可能会为这两个结构添加条目(节点表和索引),但删除数据只会从索引中删除数据。因此,随着时间的推移,节点表将继续增长,即使您删除了旧数据,因为它不会从节点表中删除。

背后的实际原因有两个:

  1. 整数ID部分编码文件偏移,因此ID到节点查找是快速文件扫描,因此当数据被删除时,您不能删除节点表的部分而不必重写所有节点ID,即节点表中的节点ID - >节点方向是一个顺序文件(有助于使插入非常快)
  2. 删除数据时,您不知道是否多次使用节点而未进行完整的数据库扫描。因此,您无法确定是否应首先删除节点表条目。唯一可行的方法是实现完整的引用计数方案,这本身就会增加系统的复杂性并减缓添加和删除。
  3. 免责声明 - 我是Jena项目的提交者但是从未亲自在TDB组件上做过任何工作,所以这反映了我最好的理解,可能不完全准确。