查询时管理内存

Manage of memory on query

我的 OrientDB 架构中有一个很大的 table(很多列和一些行)。

(列早 35.000,行早 100.000)。

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

SELECT COUNT(@rid) FROM myTable WHERE filters

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

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

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

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

第一个问题:

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

第二个问题:

为什么一个简单的COUNT占用那么多内存?有一个关于分页依赖于列数的策略?

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

设置索引

在用于过滤查询数据的字段上使用索引,将会带来改进。 在 OrientDB 中有多种类型的索引,每种索引在特定情况下都具有优势 index。因此,索引选择取决于您的情况。 在我的测试中,我使用了 'SB-TREE'.

验证 ORIENTDB 进程占用的 RAM

使用默认设置(OrientDB 自动配置 DISKCACHE = 5.064MB(堆 = 455MB),上传 Person class 的 100,000 个顶点和 3 个属性(id、name、city),我有以下内存值:

  • 数据库大小 = 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 进程使用的 RAM

增加HEAP/DISKCACHE

如果您遇到“内存不足”的情况,您可以尝试增加堆:

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

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

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

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

如果没有 Tomcat 运行ning,你是否仍然 'out of memory ' 或 count() 将 return 值(足够快)??

如果到目前为止一切顺利,您可以启动 Tomcat 并查看它如何在 2 个进程(oriendb 和 tomcat)处于活动状态时运行 RAM。 如果不饱和,尝试用count()重新运行查询。得到'out of memory'? 使用活动的 tomcat,您应该尝试重新设置内存以使其对 Tomcat 和 OrientDB 都足够。 (还要考虑 OS 使用的 ram)。

编辑

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