java堆内与堆外数据交互_Java:汇总堆外数据
java堆内与堆外数据交互
探索如何以最小的垃圾回收影响和最大的内存利用率创建堆外聚合。
使用Java Map,List和Object创建大型聚合通常会产生大量堆内存开销。 这也意味着,一旦聚合超出范围,垃圾收集器将必须清理这些对象。
阅读这篇简短的文章,了解如何使用Speedment Stream ORM创建堆外聚合,这些聚合可以更有效地利用内存,而对GC的影响很小或没有。
人
假设我们有大量采用以下形状的Person
对象:
public class Person {private final int age;private final short height;private final short weight; private final String gender;private final double salary;…// Getters and setters hidden for brievity
}
出于争论的目的,我们还可以访问一个名为persons()
的方法,该方法将使用所有这些Person
对象创建一个新的Stream
。
每年龄工资
我们想为每个年龄段创建平均工资。 为了表示汇总的结果,我们将使用称为AgeSalary
的数据类,该数据类将某个年龄与平均工资相关联。
public class AgeSalary {private int age;private double avgSalary;… // Getters and setters hidden for brievity
}
工资的年龄分组通常只需要使用不到100个存储桶,因此此示例仅用于说明原理。 存储桶越多,聚集异端越有意义。
解
使用Speedment Stream ORM,我们可以通过以下三个步骤得出堆外聚合解决方案:
创建一个聚合器
var aggregator = Aggregator.builderOfType(Person.class, AgeSalary::new).on(Person::age).key(AgeSalary::setAge).on(Person::salary).average(AgeSalary::setAvgSalary).build();
聚合器可以反复使用。
计算聚合
var aggregation = persons().collect(aggregator.createCollector());
使用聚合器,我们创建了一个标准Java流收集器,其内部状态完全处于堆外。
使用汇总结果
aggregation.streamAndClose().forEach(System.out::println);
由于聚合保存的是非堆存储的数据,因此可以从显式关闭中受益,而不仅仅是在很长时间之后才进行清理。 可以通过调用close()
方法(可能是利用AutoCloseable
特性close()
来完成关闭聚合的操作,或者如上例所示,使用streamAndClose()
返回流,该流将在终止流后关闭Aggregation
。
一站式服务
上面的代码可以简化为一种有效的代码:
persons().collect(Aggregator.builderOfType(Person.class, AgeSalary::new).on(Person::age).key(AgeSalary::setAge).on(Person::salary).average(AgeSalary::setAvgSalary).build().createCollector()
).streamAndClose().forEach(System.out::println);
还支持并行聚合。 只需添加流操作Stream::parallel
并使用ForkJoin
池完成聚合。
资源资源
在此处下载Speedment
在此处阅读有关堆外聚合的更多信息
翻译自: https://www.javacodegeeks.com/2018/12/java-aggregate-data-heap.html
java堆内与堆外数据交互
java堆内与堆外数据交互_Java:汇总堆外数据相关推荐
- 前后端数据交互方法 汇总
这篇文章给大家介绍几种常用的前后端数据交互方法,并给出使用建议.以提高前后端协同开发的效率.非常的详细,推荐给小伙伴们,有需要的小伙伴可以参考下. 1.HTML赋值 输出到 Element 的 val ...
- java tcp数据包_java tcp封装成数据包【相关词_ tcp数据包处理java】
2-1.数据序号32位,TCP为发送的每一个字节都编一个号码,这里存储当前数据包数据第一 包括 网络编程结构数据JavaTCPIP的信息,所有JAVA网络编程:TCP/IP数据包结构相关内 Java实 ...
- java mysql插入数据乱码_java连接mysql插入数据出现中文乱码
java连接了mysql数据库后,程序行向数据库中插入信息,代码如下: dbhelper boringdb = new dbhelper(); boringdb.connSQL(); String i ...
- java如何写外键关联_JAVA基础:Hibernate外键关联与HQL语法
例如对于TUser类 1.实体查询 String hql = " from TUser"; 执行这条语句会返回TUser以及TUser子类的纪录. 注: 如果 TUser 类具有外 ...
- java xml数据解析_java xml解析,数据读取
xml格式<?xmlversion ="1.0"encoding="UTF-8"?> xml格式 32 寺坡镇管理员 202cb962ac59075 ...
- java数据查询_Java中的大量数据查询
问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询数据库,而查询结果是上千条甚至是上百万条记录,要求查询 问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询 ...
- 实现前后端数据交互方法汇总
此文章适合前后端协同开发经验不足的新手阅读. HTML赋值 输出到 Element 的 value 或 data-name <input type="hidden" valu ...
- vuejs前后端数据交互之从后端请求数据
本文将向大家介绍一种用vue-resource从后端请求数据的方法. 比如说从后端请求一张表过来, (1)首先,在data中return一个msg:[]数组来接收表的数据: (2)在方法中定义一个请求 ...
- alert导致ajax数据交互问题,用ajax获得数据,可是页面显示的时不加个alert就显示不出来,随意加个alert就可以 解决办法...
这是因为Ajax的异步处理的引起的 只需要把jquery中的$.ajaxSettings.async = false; 就可以了 默认为true; AJax可以通过两种方法访问服务器,即同步(脚本会停 ...
最新文章
- intval0.57100 php_php中0,'',null,false,true,FLASE,TREU,array()的相等恒等学习
- hdu 1724 Ellipse——辛普森积分
- Angular 4 依赖注入教程之一 依赖注入简介
- 爬虫篇 --- 分布式爬虫
- Spring之RestTemplate如何返回map结果集
- SAP Spartacus如何判断用户是否已经成功登录
- uva 10723——Cyborg Genes
- Java中int[]与Integer[]相互转化的方法
- php添加导航和删除导航,新增/修改/删除ECSHOP后台左侧导航菜单
- 如何使用AdminStudio软件把.exe转换成.msi
- 《大师谈游戏设计——创意与节奏》【笔记一】
- Java—筛选法求素数
- 手机投屏到电脑完美教程,安卓和苹果用户均可使用
- c语言中 输入有两行:第一行是一个正整数n,第二行是n个整数,c语言问题:输入格式 输入有多组数据.每组数据两行.第一行包含一个正整数n(小于等于1000...
- json数组排序,深拷贝,浅拷贝,删除,增加,筛选,
- 怎么压缩图片200k以下?
- 菜鸟学习OGRE和天龙八部之三: GridInfo和HeightMap文件的数据格式(已更正)
- 一个网口接网线,另一个网口做转发,用网线连接另一个电脑
- Apache配置一级反向代理和二级反向代理实现目录网站管理
- vue js根据生日计算年龄(包含阳历和农历)
热门文章
- 牛客题霸 [括号序列] C++题解/答案
- 牛客题霸 [ 	调整数组顺序使奇数位于偶数前面] C++题解/答案
- [SCOI2007] 修车(费用流 + 差分时间段建图)
- [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
- Message Decoding密码翻译
- Loj#6053-简单的函数【Min25筛】
- 【DP】饥饿的WZK(jzoj 1998)
- 5、mysql中的库操作
- 19、java中枚举
- 自然语言处理中的Attention Model:是什么以及为什么[一]