超大集合数据分片策略

文章目录

  • 超大集合数据分片策略
    • 一、实际场景
    • 二、解决思路
    • 三、实现方法
      • 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基础之超大集合数据分片策略相关推荐

  1. Java 基础面试之集合

    Java 基础面试之集合 1.Collection接口 的实现类 答:Collection接口有3个子接口:List.Set.Queue a.List(有序.可重复):的实现类有ArrayList.V ...

  2. java基础入门-04-【集合学生管理系统】

    Java基础入门-04-[集合&学生管理系统] 11.集合&学生管理系统 11.1.ArrayList 集合和数组的优势对比: 11.1.1 ArrayList类概述 11.1.2 A ...

  3. Java基础(28)数据输入输出流、内存操作流、打印流、随机访问流、序列化与反序列化流、Properties类(集合)

    1. 数据输入输出流 1. 数据输入输出流的概述: (1)以Stream结尾的,一般都是字节流 (2)数据输入流(DataInputStream):数据输入流允许应用程序以与机器无关方式从底层输入流中 ...

  4. Java基础知识与集合部分面试题整理

    JAVA基础知识 一.JDK与JRE 1.JDK和JRE的区别 可从面向对象.主要作用和组成部分三方面对比.如下图所示: 2.JDK – Java Development Kit 1). 主要面向开发 ...

  5. java基础测试大集合 今天收罗精选一下Java题 适合小白挑战和新手回顾

    基础一 1.JRE是什么?作用是什么? JRE是java运行环境.它包含了JVM和一些支撑java运行的核心类库. 2.JDK的是什么?作用是什么? JDK是java开发环境.它包含了运行java所需 ...

  6. 跟我学ShardingSphere之数据分片策略

    在前面一篇<跟我学ShardingSphere之SpringBoot + ShardingJDBC分库>我们介绍了如何利用ShardingJDBC进行分库,用到了inline行表达式分片策 ...

  7. java基础2.5(集合)

    java基础第二阶段之day5 一.集合分类 集合类体系结构图: 二.Collection集合 1. Collection介绍 Collection集合,它是单列集合,创建Colection集合的对象 ...

  8. Java基础02 方法与数据成员

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...

  9. [F2F] Java基础 (JDK特性/集合/IO/锁)

    简介 Java基础包含:JDK特性,集合, IO, 多线程 / 锁,JVM / JVM调优 等几大类, 单篇幅限制本文主要为 JDK特性,集合, IO,其他为链接到另一篇文章 多线程 / 线程池

最新文章

  1. kazoo源码分析:Zookeeper客户端start概述
  2. Beaglebone Black开发板安装驱动
  3. Activiti邮件任务
  4. [转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
  5. 河北省高校计算机大赛,河北省教育厅关于举办2016年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛的通知...
  6. 虚拟化技术--桌面虚拟化(VDI)
  7. 接口测试工具---apipost控制台使用
  8. python编写量化交易程序英语_Python量化交易开源框架:AmazingQuant
  9. word表格完美复制到excel之浅析
  10. MacBook如何通过键盘快捷键输入特殊字符_特殊符号
  11. 【题解】#10246. 「一本通 6.7 练习 3」取石子
  12. 跳槽遇到背景调查,你可以这样做!
  13. c语言中布尔类型字节数,【C语言】中的布尔类型
  14. 一起学习正则表达式(五)断言匹配
  15. 关于继承BaseServlet后为什么form表单中必须加上method=“post”
  16. 如何查看笔记本的语言编码_在编码笔记本电脑中寻找什么
  17. 2022保育员(高级)考试模拟100题及在线模拟考试
  18. 【基础语法篇】Java必备基础(思维导图+代码)
  19. 什么是项目生命周期?如何划分项目阶段?有什么意义?
  20. n个整数,找出连续的m个数加和是最大

热门文章

  1. 利用华为云ECS服务器搭建安防视频监控平台【华为云至简致远】
  2. Redis在游戏服务器的使用,看看战力排行榜的实现
  3. EML文件(MIME邮件)格式分析
  4. 3GPP 24.008 Cause汇总
  5. Java学习笔记(第二周)
  6. 1-1 统计数字问题
  7. 通过淘宝接口免费获取IP地址信息
  8. 企业最大的危机,永远来在于内部
  9. 对图像进行批量处理——matlab
  10. 几款免费流程图制作软件