查询OrientDB时超出了GC开销限制

时间:2016-04-19 20:41:50

标签: memory-management garbage-collection orientdb

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

我的电脑有16GB的RAM,我向OrientDB提供8 GB(-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的classorder,有4个属性,customer,supplier和commitdate,所有的链表也是。

查询示例:

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)

2 个答案:

答案 0 :(得分:1)

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

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

所以这样我就可以避免解开很多文档并获取或查询我想要的父属性(在我的情况下是lineorder)。

答案 1 :(得分:0)

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

希望它有所帮助。

此致