查询时管理内存
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 子句中的过滤器将使用索引。
我的 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 子句中的过滤器将使用索引。