Java基础之超大集合数据分片策略
超大集合数据分片策略
文章目录
- 超大集合数据分片策略
- 一、实际场景
- 二、解决思路
- 三、实现方法
- 3.1 Guava
- 3.2 Common-Collections
- 3.3 手动编码实现
- 四、总结
一、实际场景
实际项目开发中常常为遇到超大数据量的集合,比如说一个size为100w的List。而往往实际应用中,我们不可能把这么大的数据量进行发送或传递,除了传递耗时过长,还有可能造成服务器内存溢出。所以我们往往将大集合进行数据分片,多次发送来提高灵活性和性能。
二、解决思路
将大集合拆分成若干个集合,然后分别发送或处理这些子集合。
三、实现方法
3.1 Guava
public class Main {public static List<String> ids;static {// 构造测试数据ids = new ArrayList<>(1500000);for (int i = 0; i < 1335810; i++) {ids.add(UUID.randomUUID().toString());}} /*** 1. 使用Guava工具包中Lists.partition()方法* 下面的操作就是将ids按照每个集合10000个的大小进行分割。(注意,最后一个集合可能元素不足10000个)**/@Testpublic void testGuavaTools() {List<List<String>> partitionList = Lists.partition(ids, 10000);System.out.println(partitionList.size());}
}
3.2 Common-Collections
public class Main {public static List<String> ids;static {// 构造测试数据ids = new ArrayList<>(1500000);for (int i = 0; i < 1335810; i++) {ids.add(UUID.randomUUID().toString());}}/*** 2. 使用Apache Common Collections工具包中ListUtils.partition()方法* 下面的操作就是将ids按照每个集合10000个的大小进行分割。(注意,最后一个集合可能元素不足10000个)**/@Testpublic void testCommonCollections() {List<List<String>> partitionList = ListUtils.partition(ids, 10000);System.out.println(partitionList.size());}}
3.3 手动编码实现
public class Main {public static List<String> ids;static {// 构造测试数据ids = new ArrayList<>(1500000);for (int i = 0; i < 1335810; i++) {ids.add(UUID.randomUUID().toString());}} /*** 4. 手动实现集合的数据分片* 下面的操作就是将ids按照每个集合10000个的大小进行分割。(注意,最后一个集合可能元素不足10000个)**/@Testpublic void testByMe() {List<List<String>> partitionList = partition(ids, 10000);System.out.println(partitionList.size());System.out.println(partitionList.get(partitionList.size() - 1).size());}public static <T> List<List<T>> partition(List<T> source, int size) {List<List<T>> result = new ArrayList<>();// 1. 先计算出余数int remainder = source.size() % size;// 2. 商int number = (int) Math.ceil((double) source.size() / (double) size);// 3. 初始偏移量默认为0int offset = 0;List<T> value;for (int i = 0; i < number; i++) {if (i == number - 1) {value = source.subList(i * number + offset, i * number + offset + remainder);} else {value = source.subList(i * number + offset, (i + 1) * number + offset);}result.add(value);}return result;}
}
四、总结
注意: 拆分后的每个子集合的数据,必须是可以执行的独立业务单元数据。
Java基础之超大集合数据分片策略相关推荐
- Java 基础面试之集合
Java 基础面试之集合 1.Collection接口 的实现类 答:Collection接口有3个子接口:List.Set.Queue a.List(有序.可重复):的实现类有ArrayList.V ...
- java基础入门-04-【集合学生管理系统】
Java基础入门-04-[集合&学生管理系统] 11.集合&学生管理系统 11.1.ArrayList 集合和数组的优势对比: 11.1.1 ArrayList类概述 11.1.2 A ...
- Java基础(28)数据输入输出流、内存操作流、打印流、随机访问流、序列化与反序列化流、Properties类(集合)
1. 数据输入输出流 1. 数据输入输出流的概述: (1)以Stream结尾的,一般都是字节流 (2)数据输入流(DataInputStream):数据输入流允许应用程序以与机器无关方式从底层输入流中 ...
- Java基础知识与集合部分面试题整理
JAVA基础知识 一.JDK与JRE 1.JDK和JRE的区别 可从面向对象.主要作用和组成部分三方面对比.如下图所示: 2.JDK – Java Development Kit 1). 主要面向开发 ...
- java基础测试大集合 今天收罗精选一下Java题 适合小白挑战和新手回顾
基础一 1.JRE是什么?作用是什么? JRE是java运行环境.它包含了JVM和一些支撑java运行的核心类库. 2.JDK的是什么?作用是什么? JDK是java开发环境.它包含了运行java所需 ...
- 跟我学ShardingSphere之数据分片策略
在前面一篇<跟我学ShardingSphere之SpringBoot + ShardingJDBC分库>我们介绍了如何利用ShardingJDBC进行分库,用到了inline行表达式分片策 ...
- java基础2.5(集合)
java基础第二阶段之day5 一.集合分类 集合类体系结构图: 二.Collection集合 1. Collection介绍 Collection集合,它是单列集合,创建Colection集合的对象 ...
- Java基础02 方法与数据成员
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...
- [F2F] Java基础 (JDK特性/集合/IO/锁)
简介 Java基础包含:JDK特性,集合, IO, 多线程 / 锁,JVM / JVM调优 等几大类, 单篇幅限制本文主要为 JDK特性,集合, IO,其他为链接到另一篇文章 多线程 / 线程池
最新文章
- kazoo源码分析:Zookeeper客户端start概述
- Beaglebone Black开发板安装驱动
- Activiti邮件任务
- [转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
- 河北省高校计算机大赛,河北省教育厅关于举办2016年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛的通知...
- 虚拟化技术--桌面虚拟化(VDI)
- 接口测试工具---apipost控制台使用
- python编写量化交易程序英语_Python量化交易开源框架:AmazingQuant
- word表格完美复制到excel之浅析
- MacBook如何通过键盘快捷键输入特殊字符_特殊符号
- 【题解】#10246. 「一本通 6.7 练习 3」取石子
- 跳槽遇到背景调查,你可以这样做!
- c语言中布尔类型字节数,【C语言】中的布尔类型
- 一起学习正则表达式(五)断言匹配
- 关于继承BaseServlet后为什么form表单中必须加上method=“post”
- 如何查看笔记本的语言编码_在编码笔记本电脑中寻找什么
- 2022保育员(高级)考试模拟100题及在线模拟考试
- 【基础语法篇】Java必备基础(思维导图+代码)
- 什么是项目生命周期?如何划分项目阶段?有什么意义?
- n个整数,找出连续的m个数加和是最大