Java:ChronicleMap第2部分,超级RAM映射

诸如无处不在的HashMap类的标准Java Map最终受到可用RAM的限制。 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机的RAM大小的Java Map。

内置的Map实现,例如HashMapConcurrentHashMap ,只要它们相对较小,就可以正常工作。 在所有情况下,它们都受可用堆的限制,因此最终受可用RAM大小的限制。 ChronicleMap可以将其内容存储在文件中,从而规避了此限制,为TB级的映射打开了空间,如有关CronicleMap系列文章的第二篇文章所示。

在我之前的第一篇文章中了解有关CronicleMap基础知识的更多信息。

文件映射

通过在ChronicleMap构建器上调用createPersistedTo()方法来进行文件映射,如下所示:

private static Map<Long, Point> createFileMapped() {try {return ChronicleMap.of(Long.class, Point.class).averageValueSize(8).valueMarshaller(PointSerializer.getInstance()).entries(10_000_000).createPersistedTo(new File("my-map"));} catch (IOException ioe) {throw new RuntimeException(ioe);}
}

这将创建一个Map,将其内容布局在名为“ my-map”的内存映射文件中,而不是直接内存中。 以下示例说明了如何创建1000万个Point对象并将其全部存储在文件映射图中:

final Map<Long, Point> m3 = LongStream.range(0, 10_000_000).boxed().collect(toMap(Function.identity(),FillMaps::pointFrom,(u, v) -> {throw new IllegalStateException();},FillMaps::createFileMapped));

以下命令显示了新创建的文件:

Pers-MacBook-Pro:target pemi$ ls -lart my-map 
-rw-r--r--  1 pemi  staff  330305536 Jul 10 16:56 my-map

可以看出,该文件约为33 MB,因此每个条目平均占用33个字节。

坚持不懈

当JVM终止时,映射文件仍然存在,从而可以轻松地拾取先前创建的包含其内容的映射。 这非常类似于基本的超快数据库。 这是我们从现有文件开始的方法:

return ChronicleMap.of(Long.class, Point.class).averageValueSize(8).valueMarshaller(PointSerializer.getInstance()).entries(10_000_000).createOrRecoverPersistedTo(new File("my-map"));

Map将直接可用,包括以前的内容。

Java Map超出RAM限制

内存映射文件的一个有趣方面是,它们可以超过堆和RAM的限制。 文件映射逻辑将确保当前使用的部件按需加载到RAM中。 映射逻辑还将在物理内存中保留已访问映射内存的最新部分,以提高性能。 这发生在幕后,不需要由应用程序本身进行管理。

我的台式计算机是只有16GB内存的较旧的MacBook Pro(是的,我知道那很糟)。 不过,我可以分配一个Map其中包含10亿个条目,它们可能占用33 * 1,000,000,000 = 33 GB内存(我们从上面记得,每个条目平均占用33个字节)。 代码如下:

return ChronicleMap.of(Long.class, Point.class).averageValueSize(8).valueMarshaller(PointSerializer.getInstance()).entries(1_000_000_000).createPersistedTo(new File("huge-map"));

即使我尝试用2倍于我的RAM大小创建Java Map,代码也可以完美运行,并得到以下文件:

Pers-MacBook-Pro:target pemi$ ls -lart | grep huge-map 
-rw-r--r--   1 pemi  staff  34573651968 Jul 10 18:52 huge-map

不用说,您应该确保要映射的文件位于具有较高随机访问性能的文件系统上。 例如,位于本地SSD上的文件系统。

摘要

ChronicleMap可以映射到外部文件
JVM退出时保留映射的文件
新应用程序可以选择现有的映射文件 ChronicleMap可以容纳的数据多于RAM 映射文件最好放在具有较高随机访问性能的文件系统上

翻译自: https://www.javacodegeeks.com/2019/08/java-chroniclemap-super-ram-maps.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jsp中的java部分_jsp页面的七个组成部分

jsp页面的七个组成部分1. 静态内容&#xff1a;前端内容一行一行翻译成 out.write(“前端内容”);2. 指令&#xff1a; 第一个指令是pagepage指令的第一个标准用法&#xff0c;告诉servlet容器&#xff0c;这是一个jsp页面pageEncoding 指…

java多线程做一件事_关于Java的十件事

java多线程做一件事那么&#xff0c;您从一开始就一直在使用Java&#xff1f; 还记得那些被称为“ Oak”的日子&#xff0c;OO仍然是热门话题&#xff0c;C 人士认为Java没有机会&#xff0c;Applet还是一件事吗&#xff1f; 我敢打赌&#xff0c;您至少不了解以下一半内容。 …

java第二章复习_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用做专门用途的字符串(单词)特点&#xff1a;关键字中所有字母都为小写保留字(rese…

打造大型直播平台之《PC客户端架构》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

Java中的装饰器设计模式

装饰器设计模式允许在运行时将附加职责或行为动态附加到对象。 它是一种结构模式&#xff0c;利用聚合来组合这些行为。 在本教程中&#xff0c;我们将学习实现装饰器模式。 UML图&#xff1a; 让我们从装饰器模式的UML表示开始&#xff1a; ConcreteComponent类是我们希望为…

冲击波病毒攻击-《截获网站服务器数据》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可

java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

ModBus 的Crc16校验package testCase;public class CRC16M {static final String HEXES "0123456789ABCDEF";byte uchCRCHi (byte) 0xFF;byte uchCRCLo (byte) 0xFF;private static byte[] auchCRCHi { 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x0…

用户控件 自定义控件_新的自定义控件:TaskProgressView

用户控件 自定义控件我已经编写了一个新的自定义控件&#xff0c;并将其提交到ControlsFX项目。 这是一个高度专业的控件&#xff0c;用于显示后台任务&#xff0c;其当前状态和进度的列表。 这实际上是我为ControlsFX编写的第一个控件&#xff0c;只是出于乐趣的考虑&#xff…

C/C++码农到工程师进化之路

今晚课题长按图片【识别图中的二维码】

java菜鸟到cto 图_从菜鸟到入门,掌握 Log4j

1 简介Log4j(log for java)是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&a…

Java中的复合设计模式

当我们必须使用对象的树状分层结构时&#xff0c;复合设计模式非常有用。 它使我们能够统一对待单个对象和对象的组成。 它属于结构设计模式的范畴&#xff0c;因为它将对象组合成树形结构以表示部分整个层次结构。 UML表示形式&#xff1a; 复合模式的UML表示形式如下&#…

腾讯官方游戏《陆战之王 3D坦克大战》

今晚课题长按图片【识别图中的二维码】

hazelcast入门教程_Hazelcast入门指南第4部分

hazelcast入门教程这是我的Hazelcast系列的第四部分。 如果一个人没有看到其他三个人&#xff0c;我建议一个人去看第1 部分 &#xff0c; 第2 部分和第3部分 。 记录中 日志记录是任何应用程序的重要功能&#xff0c;我的示例也是如此。 System.out.println可以用作告诉用户控…

《地下城与勇士歼灭贝内尔》回合格斗

今晚课题长按图片【识别图中的二维码】

java继承执行子类输出顺序_JAVA继承顺序

当使用继承这个特性时&#xff0c;程序是如何执行的&#xff1b;继承的初始化顺序1.初始化父类再初始子类2.先执行初始化对象中属性&#xff0c;再执行构造方法中的初始化当使用继承这个特性时&#xff0c;程序是如何执行的呢&#xff0c;也就是说我们需要关注继承的初始化顺序…

空字符串字符串不为空_当字符串为空但不为空时

空字符串字符串不为空介绍 我团队中的一名初级程序员遇到了一个有趣的错误。 我已经不止一次看到它的症状。 这篇文章是寻找什么以及如何在将来防止它。 我还将探讨该问题的不同解决方案。 病征 有问题的代码看起来做得不错。&#xff1a; if(trouble ! null && !tro…

网络通信协议-TCP/IP模型实战

今晚课题长按图片【识别图中的二维码】

java家具网站需求分析_基于jsp的家具销售-JavaEE实现家具销售 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的家具销售, 该项目可用各类java课程设计大作业中, 家具销售的系统架构分为前后台两部分, 最终实现在线上进行家具销售各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类家具销售相关的实体进行管理。该家具…

hazelcast入门教程_Hazelcast入门指南第2部分

hazelcast入门教程本文是我开始使用Hazelcast &#xff08;分布式内存数据库&#xff09;的系列文章的继续。 如果尚未阅读第一篇文章&#xff0c;请单击此处 。 分布式馆藏 Hazelcast具有许多可用于存储数据的分布式集合。 以下是它们的列表&#xff1a; 清单 我设置 队列…

C/C++深入剖析指针机制与内存动态管理

今晚课题【长按识别图中二维码】