0

我的 OrientDB 模式中有一个大表(很多列和一些行)。

(列早 35.000,行早 100.000)。

当我尝试使用简单的 COUNT 查询我的表时,如下所示:

SELECT COUNT(@rid) FROM myTable WHERE filters

我的进程占用了早期的 8 GB 内存。

如果我尝试使用索引符号重写我的查询,如下所示:

SELECT COUNT(@rid) FROM index:myIndex WHERE key = [value1, ... valueN]

我的进程占用了早期的 8 GB 内存。

第一个问题:

我为东方预留了 8 GB 内存,对于应用服务器,我必须预留相同的内存吗?因为,使用 Orient 的 DISK CACHE 属性,对其内存的管理是可以的,但是在应用程序服务器(Tomcat)下我得到了内存不足的错误。

第二个问题:

为什么一个简单的 COUNT 会占用所有这些内存?有一个关于分页依赖于列数的策略吗?

4

1 回答 1

1

尝试在没有 Tomcat 的情况下启动 db orient,并验证这一点:

设置索引

在用于过滤查询中的数据的字段上使用索引,这将导致改进。在 OrientDB 中有多种类型的索引,每种索引在某些情况下都有优势index。因此,索引选择取决于您的情况。在我的测试中,我使用了“SB-TREE”。

在此处输入图像描述

验证 ORIENTDB 进程占用的 RAM

使用默认设置(OrientDB autoconfig DISKCACHE = 5.064MB(heap = 455MB),上传具有 3 个属性(id、name、city)的 Person 类的 100,000 个顶点,我有以下内存值:

  • 大小 db = 80 MB
  • 查询 = SELECT COUNT(@rid) FROM Person WHERE id >= 0
  • 时间查询执行 =(冷)3.57 秒。(热)1.88 秒。
  • 验证查询使用了索引 =explain SELECT COUNT(@rid) FROM Person WHERE id >= 0并检查“involvedIndexes”列下是否有您创建的索引(在我的情况下为 [“Person.id”])
  • OrientDB 进程(打开工作室)= 442 MB(命令:ps -ef | grep orient你得到 idprocess,然后:top -pYOUR_ID

时间查询: 在此处输入图像描述

索引使用: 在此处输入图像描述

orientdb 进程使用的内存 在此处输入图像描述

增加堆/磁盘缓存

如果您有“内存不足”,您可以尝试增加堆:

  • 在 orientdb 所在位置的 /bin 文件夹中打开文件 Server.sh(适用于 linux)或 server.bat(适用于 windows)。
  • 设置 MAXHEAP = -Xmx2048m

如果在使用索引增加缓存后查询仍然很慢:

  • MAXDISKCACHE = "- Dstorage.diskCache.bufferSize = 8192 FOR 8GB"

显然,堆值和缓存取决于系统上有多少 RAM。它考虑到使用 Ram 增加太多对于操作系统来说已经饱和,而且更多只会带来缺点。

如果没有运行 Tomcat,您是否仍然“内存不足”或者 count() 将返回值(足够快)?

如果到目前为止一切顺利,您可以启动 Tomcat 并查看它在 2 个进程(oriendb 和 tomcat)处于活动状态时如何表现 RAM。如果未饱和,请尝试使用 count() 重新运行查询。让“失忆”?使用活动的 tomcat,您应该尝试重新设置内存以使其对 Tomcat 和 OrientDB 都足够。(还要考虑操作系统使用的 ram)。

编辑

正确的方法是,如果您已经知道类中必须存在哪些属性,则立即创建该属性并在每个属性上创建其相对索引。这样,当您添加顶点时,索引会在输入后自动更新。因此,当您运行查询时,您确定 where 子句中的过滤器将使用索引。

于 2016-03-01T11:42:41.747 回答