DolphinDB使用时出现的OOM问题有没有常用的解决办法?

由于才开始使用DolphinDB,对它的内存管理方面不太熟悉,经常由于不合理的操作出现OOM的情况,请问有没有什么规范的解决流程?或者说常用的解决思路?

请先 登录 后评论

1 个回答

Johhny

数据导入到内存表中时,如使用select语句查询分区表中的数据、文件数据直接加载到内存表、查询维度表等,出现OOM的情况,通常的解决办法有:

1.执行

pnodeRun(clearAllCache)

释放所有节点的缓存(定义变量占用的内存不会释放

2.执行

select site, maxMemSize, memoryUsed, memoryAlloc from rpc(getControllerAlias(),getClusterPerf)

看下当前所有数据节点内存使用情况:
(1)确认是不是哪个数据节点被定义变量占用太多的内存,导致内存不足,执行

pnodeRun(objs) //查询每个节点定义变量占用内存(不共享的)
pnodeRun(objs{true}) //查询每个节点定义变量占用内存(共享的)

查看每个数据节点上定义的变量和占用的内存:使用udef()、undef all、变量名=NULL释放非共享变量占用内存;使用 undef("sharedTable", SHARED)释放共享变量占用内存。
(2)maxMemSize是不是受到了限制
a.社区版licens限制4G(即使cluster.cfg中设置大于4G,也只能使用4G):官网申请企业版试用license,更多节点、CPU核数、内存。
b.license没有限制,但是cluster.cfg中设置maxMemSize太小了:把cluster.cfg中的maxMemSize的值改大一点,取决于license和主机配置的限制
(3)执行

license()

查看license信息,确认上述情况
3.完成上述操作后,仍然OOM,加载的数据太大了
(1)一台服务器上DolphinDB所有节点可以占用的总内存,不可以超过主机总内存,还需要考虑其它进程占用的内存,DolphinDB所有节点占用的内存需合理设置。
(2)需要加载的数据超出了服务器的极限
4.下一步解决思路:
(1)维度表,一般我们建议小数据存储才使用维度表,一张维度表加载的最大内存不能超出节点的maxMemSize:将维度表数据采用分区表存储,查询限制条件,只将涉及的分区数据加载到内存中
(2)分区表,进一步缩小查询的条件,减少查询涉及的分区数(DolphinDB查询时,只将涉及的分区数据加载到内存中)
(3)文件数据直接导入到内存表中的情况:可以先将文件数据按照合理分区,导入到DolphinDB分区数据库再查询,查询限制条件,只将涉及的分区数据加载到内存中

请先 登录 后评论