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:汇总堆外数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑cmd命令ping网络连接数据库(c
- 下一篇: 华为荣耀3x如何连接电脑(华为ax3路由