2012-06-18 39 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