我使用的是一个简单的Jena数据集,它只导入了一个~30 MB的RDF文件。作为应用程序的一部分,我试图让用户查询默认图(或命名图),并将查询的结果三元组插入到新的命名图中。为此,我使用一个构造语句以RDF形式形成三元组的结果集,然后将这些三元组放入一个新模型(使用QueryExecution.execConstruct())并将该模型添加到dataset中。随着dataset获得一个新的图形节点,并且TDB数据库文件夹的磁盘大小增大,这似乎再次工作。
当我试图从dataset中删除一个命名图时,这里出现了这个问题。使用dataset的removeNamedName("graphName")方法,我从dataset中删除模型。将来对该模型名称的查询显示它已经成功地被删除了。但是,即使在同步和退出之后,TDB数据库文件夹的磁盘大小仍然相同。
起初,我认为数据库可能只是将已删除的文件空间标记为空闲的,以便在新数据进入时可以覆盖它,但情况似乎并非如此。如果我删除一个命名图并在同一程序运行后立即替换它,文件夹似乎不会增长,但是如果我添加一个新的命名图并在相同的运行中删除它,文件夹的大小会变大,模型的删除不会释放内存,这意味着在运行几次之后,数据库文件夹的大小是原始大小的五到十倍,而不包含任何数据。
任何见解或帮助都会很好,再次感谢。
发布于 2012-06-18 23:03:41
通过询问耶拿邮件列表(users@jena.apache.org),您可能会获得更多的洞察力,但我将尝试回答。您也可以看看网站上的TDB体系结构页面。
TDB通过构建一个节点表来存储数据,该表将RDF节点映射为64位整数it,反之亦然。然后,它使用这些整数It构建单独的索引,从而允许它执行回答SPARQL查询所需的各种数据库扫描。
添加数据可能会向这两种结构(节点表和索引)添加条目,但删除数据只会从索引中删除数据。因此,随着时间的推移,节点表将继续增长,即使您删除了旧数据,因为它没有从节点表中删除。
这背后的实际原因有两个:
免责声明--我是Jena项目的提交人,但是从来没有就TDB组件做过任何个人工作,所以这反映了我最好的理解,而且可能不是完全准确的。
https://stackoverflow.com/questions/11088082
复制相似问题