【问题标题】:GC overhead limit exceeded when querying on OrientDB在 OrientDB 上查询时超出 GC 开销限制
【发布时间】:2016-11-21 05:32:16
【问题描述】:

我的数据库有 200.000 个文档,与一个包含 600 万个文档的属性相关联。当我查询它时,对于某些查询,出现错误GC开销限制超出。

我的计算机有 16GB 的 RAM,我将 8GB 分配给 OrientDB (-Dstorage.diskCache.bufferSize=8192) 并放入 -Xms1024 -Xmx2048。我尝试了其他选项,例如:-Xms128 -Xmx4096 和其他选项。

有人可以帮我解决它吗?还是 OrientDB 不够好,无法处理这么多数据?

我的数据是这样的:

{"@type":"d","@class":"part","p_partkey": 2, "lineorder": [{"@type":"d","@class":"lineorder","customer": [{"@type":"d","@class":"customer","c_city": "INDONESIA1"}], "lo_supplycost": 54120, "orderdate": [{"@type":"d","@class":"orderdate","d_weeknuminyear": 19}], "supplier": [{"@type":"d","@class":"supplier","s_phone": "16-789-973-6601|"}], "commitdate": [{"@type":"d","@class":"commitdate","d_year": 1993}], "lo_tax": 7}, {"@type":"d","@class":"lineorder","customer": [{"@t...

类部分有20万个部分,有一个属性lineorder类型的链表,每个部分有多个类lineorder的lineorder,有4个属性,客户,供应商和提交日期,也是链表。

查询示例:

select sum(eval("line.lo_extendedprice * line.lo_discount / 100")) as revenue 
from (select lineorder as line from part where lineorder.orderdate contains (d_year=1993) unwind line)
where line.lo_discount between 1 and 3 and line.lo_quantity<25 and line.orderdate contains (d_year=1993)

【问题讨论】:

  • 嗨@Raphael,您的数据库结构如何(类,...)?您执行了哪些查询/查询来获取此错误?顺便说一句,如果您有一个小型数据库测试来重现您的问题,那就太好了。
  • @LucaS,我已经尝试使用较小的数据库并且它可以工作,但是在我插入所有内容后,相同的查询返回此错误。我将在上面举一个我的数据示例。
  • 嗨@Raphael,我正在尝试重现数据集。您对某些属性有索引吗?这可以加快您的查询速度。
  • 另一件事:Lineorder 类还包含属性lo_supplycostlo_taxlo_discountlo_quantitylo_extendedprice 对吗?
  • @LucaS,我没有创建索引,因为我查询的字段不是唯一的,而且它们重复了很多次。

标签: memory-management garbage-collection orientdb


【解决方案1】:

在尝试了很多事情之后,我得到答案的唯一方法是避免在返回大量文档时对子查询响应进行展开操作。为此,我必须在 lineorder(嵌套文档的第二级)和部分之间创建关系,在这种情况下,类必须具有公共字段,在我的情况下,类 lineorder 为 lo_partkey,类部分为 p_partkey,所以我可以这样建立关系:

create link ordered type linkset from lineorder.lo_partkey to part.p_partkey

所以这样我可以避免展开大量文档并获取或查询我想要从孩子那里得到的父属性(在我的例子中是线序)。

【讨论】:

    【解决方案2】:

    Orient 有两种类型的内存:堆和磁盘缓存。 如果堆太低,您将面临内存溢出的风险,因为您的内存比您需要的少。堆内存是必要的。 磁盘缓存用于性能,内存越高,性能越高,如果您没有足够的磁盘缓存,性能会下降。 磁盘缓存最多必须与数据库一样大。 您必须增加堆内存并减少磁盘缓存内存。

    希望对你有帮助。

    问候

    【讨论】:

    • 是否磁盘缓存必须最多与数据库一样大,或者至少?是不是很矛盾?如果我减少磁盘缓存是否会降低性能?
    • 嗨@Raphael,磁盘缓存必须最多与数据库一样大,是的,如果您减少磁盘缓存,您将失去性能
    猜你喜欢
    • 2017-11-02
    • 2011-05-21
    • 2017-12-27
    • 2013-07-13
    • 2018-03-29
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多