问题1: 1亿个数和10w个数取交集
jdk 1.8, jvm取默认配置
A: JVM默认开启指针压缩的情况下,一个Integer对象 = object header + 实例数据 + 填充对齐 = (8+4) + 4 + 0 = 16, 8字节的动态数据结构,和sync锁升级相关,默认偏向锁,4字节压缩(不压缩是8字节),4字节实例数据,0字节填充。根据计算2G内存可以接近存1.4亿的数据,10亿数据也只要16G内存可以操作完。
这个交接可以直接用内存搞定,取个集合做交集即可。
问题2: 100亿个数和10w个数取交集
A: 按照问题1分析,所以不能在用内存进行操作。因此采用 hash+分治
进行处理
- 将100亿个数按照10取于分为10堆,按照内存配置,可以是100堆,1024堆,取决于机器大小
- 将10w个数按照上述思路依旧分为10堆,100对,1024堆。
- 将100亿的数据和10w的数据进行集合取交集,最终归并到一起。