求助:SPL 中如何界定大表小表
如题,在 SPL 中如何界定某个表是大表还是小表,多小算大,多大算小?
没有写错,我想表达的意思是大表的下限和小表的上限。比如,以 50 万行 25 列为基准,超过该基准的属于大表,未达到该基准的属于小表;或者说,以表的大小 100M 为基准,超过 100M 属于大表,小于 100M 的属于小表。论坛有这样一篇文章 新手如何使用 SPL 存储 中也有相关的论述 "SPL 对于大表和小表采取不同的存储方式,我们先要对表的大小加以区分。小表是指数据量不大,内存能够全部装下的表……而大表的数据量很大,内存无法全部装下"。这样的论述没有问题,但不是很直观,不同的机器有不同的内存,大小也是相对而言的。所以,对我这样一个小白来说,如果能把大小描述成一个 ballpark figure,会更形象,更容易操作。比如,在 SPL 中:
1、8G 内存的机器,多少兆的表或者说多少行多少列的表可以被认定为大表?
举个例子,我创建了一个 52 万行 30 列,大小是 202M 的 btx 文件,在本机完全读取时,内存溢出了,那是不是就属于大表了?然后,52 万行 25 列的 btx 文件,能全数据读出来,但读的不丝滑,需花点时间,此时该表是不是属于小表?界定的标准按能否全数据读取还是按能否丝滑读取?
2、内表,也就是能塞进内存的表,SPL 中有个函数 memory 可以把表转换成内表。这同样跟内存大小有关,没有定量,内存越大总归会越有优势。那在实际操作时,编写代码的人总得心里有个底,本机什么样的配置,碰到什么样的表才能将其转成内表,而不是 mindlessly 无脑式的往内存塞。还是跟上述一样,没有一个具象的文件大小或者行列多少的范围,感觉很抽象。
以上问题描述,非科班小白表述的力度不够,不专业。意思其实很简单,可不可以有一个大概的范围来描述大表小表,这个范围是相对于某种大小的内存而言的,多少行多少列,或者多少兆。这样的话,在编写代码时会有一个 ballpark figure,心里有谱。
就像山上有雪和雪山的完全不同,数据量大和大数据也是截然不同的概念,恳请大佬们得闲时给予帮助解惑。
谢谢!
就是靠实验。数据类型不同,占的空间也不同,整数比较小,日期就较大,字符串还要看长度,所以只说几行几列没什么信息量。
实验时看 gc 是不是比较多,不流畅了就说明内存紧张了。
无法实验时,经验上看,可以按一格占半 K 来估算。52 万行 *30 列 *0.5K,大概就是 8G。原则上这些内存不要超过 JVM 内存的一半就会比较流畅(gc 时几乎需要同样大的内存),Java 的内存使用率一直比较低。
谢谢老贼,您这样一指点,我在编写代码的时候至少有点数了。
看来还是得多写多思考积累经验。that’s the way of whetting a skill:)
我再多问一句🙏 见谅:
1、gc 是不是指垃圾回收,这个可以在哪里观察到?帮助菜单里有一个内存清理,是不是图中的第三项?
2、JVM 内存是不是指 IDE 里标明的值,比如,海外版的 IDE 常规选项卡里有这样的标识:
这个标识在 Mac 社区版里倒是没找到。
1 是垃圾收集,这个要看日志中 gc 的时间,OS 的界面看不出来
2 这个没错
mac 版中您可以在启动文件(集算器根目录 /esProc/bin/startup.sh)中配置 java 虚拟机内存, 例如:”$EXEC_JAVA“ -Xms128m -Xmx9444m
谢谢大佬指导。
真是问的越多,知道的越少,有点不好意思了,我再弱弱问一句:
老贼说的 "要看日志中的 gc 时间",这日志去哪里找?我这 log 文件夹里的是空的。
麻烦再指点一下🙏 😄
要想查看 gc 情况, 可以给 jvm 加属性 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC
查看 jvm 支持的属性可以用:java -XX:+PrintFlagsFinal
到处都是知识盲区,这些对我来说完全不会了。😳
不懂就问,学习也不兴脸皮薄,不会就是不会。
恳请大佬指导:🙏 🙏
如何给 WIN 版 SPL、MAC 版 SPL 加 gc 属性?
能不能简单写一个小白适用的保姆式的 steps?
Thx a mln!
程序已更新,在【选项】-【java 虚拟机参数】中增加了 GC 参数的相关设置,请移步下载贴中下载最新的 esproc-bin.jar 文件 。
mac 版本中无法在 ide 中配置【java 虚拟机内存】的问题,下版安装包中将进行更新优化。
感谢 ddszm 大佬,zaoya 大佬,大佬们辛苦啦!
感谢老贼,老贼威武!
SPL…遥遥领先!