首页 文章

GraphDB查询无提示失败(OutOfMemoryError)

提问于
浏览
1

我正在处理一个非常庞大的存储库(即~16M语句) . 我正在尝试获取图表中所有不同类成员模式的列表 . 这是查询:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select distinct (group_concat(?t) as ?fo)
where { 
    ?s rdf:type ?t.    
} 

group by (?s)
order by ?fo

当然,这样的查询必须返回结果 . 奇怪的是,有时候我得到了我需要的结果,有时候查询没有返回任何结果 .

为什么会发生这种情况,我该如何避免呢?

PS:监控查询,我注意到当我没有数据时,查询状态仍然停留在:

IN_HAS_NEXT

0 operations

直到结论 .

Update:

Here是描述问题的主要日志 . GraphDB工作台的输出是:

没有结果 . 几分钟前,查询耗时1分53秒 .

没有提到错误 . 很奇怪 . 正如Gilles-Antoine Nys指出的那样,内存和Java的GC存在问题 . 总的来说,我认为工作台在这种情况下应该明确地显示错误消息 .

2 回答

  • 1

    正如其他评论已经表明错误是由OME引起的 . 在下一个即将发布的GraphDB 8.6版本中,开发人员对所有聚合进行了更高效的内存实现 . 在公开发布之前,只有很少的选项可供测试:

    • 通过编写稍微更优化的查询版本来减少内存消耗量,该版本仅显示本地名称:

    PREFIX rdf:http://www.w3.org/1999/02/22-rdf-syntax-ns#
    选择?s_local(group_concat(?t_local)为?fo)
    在哪里{
    ?s rdf:type?t .
    BIND(REPLACE(STR(?t),“^( . *)(/ |#)([^#/] *)$”,“$ 3”)为?t_local)
    BIND(REPLACE(STR(?s),“^( . *)(/ |#)([^#/] *)$”,“$ 3”)为?s_local)
    分组(?s_local)
    订单(?fo)

    • 增加可用RAM以执行所有聚合计算 . 您可以通过传递更高的 -Xmx 参数值或在graphdb.properties中设置 graphdb.page.cache.size 的最小数字来增加它,例如: graphdb.page.cache.size=100M . 缓存控制存储在内存页面中的数量,这对于您的查询和存储库大小来说不会产生太大影响 .

    • 使用 -Dgraphdb.engine.function.concat.max-length=4096 限制组concat字符串的最大长度 . 该限制不会使查询成功执行,但它会指示,问题是否过多的主题字符串太长 .

  • 3

    首先,您的查询无法为您提供可由类型定义的类...我重新开始在您的 select 中添加 ?s 以表达性能 . 所以你可以轻松回答你的问题 .

    这是最简单的查询:

    select ?s (group_concat(?t) as ?fo)
    where { 
    ?s rdf:type ?t.    
    } group by (?s)
    

    (如果对你很重要,可以添加 order by(?fo) ) .

    其次, IN_HAS_NEXT 只是在监视器中暂停时的查询状态 . 与错误无关 .

    最后,验证您的 query-timeout 参数 . 其默认值设置为0 .

    Update :

    实际上你的LogFile中有两个错误 . 问题是你的JVM对垃圾收集器的占用时间太长(仍然使用98%以上的内存) .

    一种解决方案是增加GC开销限制,因此可以处理您庞大的数据集 .

相关问题