数据导入到内存表中时,如使用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分区数据库再查询,查询限制条件,只将涉及的分区数据加载到内存中
数据导入到内存表中时,如使用select语句查询分区表中的数据、文件数据直接加载到内存表、查询维度表等,出现OOM的情况,通常的解决办法有:
1.执行
释放所有节点的缓存(定义变量占用的内存不会释放)
2.执行
看下当前所有数据节点内存使用情况:
(1)确认是不是哪个数据节点被定义变量占用太多的内存,导致内存不足,执行
查看每个数据节点上定义的变量和占用的内存:使用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信息,确认上述情况
3.完成上述操作后,仍然OOM,加载的数据太大了
(1)一台服务器上DolphinDB所有节点可以占用的总内存,不可以超过主机总内存,还需要考虑其它进程占用的内存,DolphinDB所有节点占用的内存需合理设置。
(2)需要加载的数据超出了服务器的极限
4.下一步解决思路:
(1)维度表,一般我们建议小数据存储才使用维度表,一张维度表加载的最大内存不能超出节点的maxMemSize:将维度表数据采用分区表存储,查询限制条件,只将涉及的分区数据加载到内存中
(2)分区表,进一步缩小查询的条件,减少查询涉及的分区数(DolphinDB查询时,只将涉及的分区数据加载到内存中)
(3)文件数据直接导入到内存表中的情况:可以先将文件数据按照合理分区,导入到DolphinDB分区数据库再查询,查询限制条件,只将涉及的分区数据加载到内存中