Java:ChronicleMap第2部分,超级RAM映射
诸如无处不在的HashMap
类的标准Java Map最终受到可用RAM的限制。 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机的RAM大小的Java Map。
内置的Map实现,例如HashMap
和ConcurrentHashMap
,只要它们相对较小,就可以正常工作。 在所有情况下,它们都受可用堆的限制,因此最终受可用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
Java:ChronicleMap第2部分,超级RAM映射相关推荐
- java获取ram_Java:ChronicleMap第2部分,超级RAM映射
java获取ram 诸如无处不在的HashMap类的标准Java Map最终受到可用RAM的限制. 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机RAM大小的Java Map. 内置的Map实现 ...
- 重拾java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- 毕向东—Java基础知识总结(超级经典)
Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...
- Java 时间和日期类型的 Hibernate 映射
以下情况下必须显式指定 Hibernate 映射类型 一个 Java 类型可能对应多个 Hibernate 映射类型. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hi ...
- 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )
文章目录 一.报错信息 二.解决方案 一.报错信息 使用 javadoc 命令 , 生成 Java 文档 , 报错 ; javadoc Student.java D:\develop\javadoc& ...
- websockets_使用Java WebSockets,JSR 356和JSON映射到POJO的
websockets 因此,我一直在研究Tyrus (JSR 356 WebSocket for Java规范的参考实现). 因为我一直在寻找测试工具,所以我对在Java中同时运行客户端和服务器端感兴 ...
- 使用Java WebSockets,JSR 356和JSON映射到POJO的
因此,我一直在研究Tyrus (JSR 356 WebSocket for Java规范的参考实现). 因为我一直在寻找测试工具,所以我对在Java中同时运行客户端和服务器端感兴趣. 因此,恐怕此博客 ...
- 适用智能电表,热能表,气表等段码LCD液晶显示驱动芯片I2C 接口VK2C22A/B,RAM映射44*4, 40*4
---------------------------------- 永嘉微电 I²C 接口LCD 控制及驱动IC 型号: VK2C22A:RAM 映射 44*4封装(LQFP-52) LCD液晶显 ...
- 【已解决】Java “错误:编码GBK 的不可映射字符”
[已解决]Java "错误:编码GBK 的不可映射字符" 正文 import java.awt.*; import java.awt.datatransfer.Clipboard; ...
最新文章
- 深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子
- 哈佛大学 NLP 组开源神经机器翻译系统 OpenNMT
- SharePoint Server 2016 部署安装(三)—— 安装SharePoint Server
- C语言中 怎样区分八进制 十进制 二进制?
- CSS块级元素和行内元素
- 【css】怎么让Chrome支持小于12px 的文字
- Github 开源了新型肺炎防疫项目,助力抗击疫情!
- 爬虫笔记(十四)——BeautifulSoup库
- 论模式在领域驱动设计中的重要性
- 图解 ElasticSearch 原理,写得太好了!
- qml 发光_“木头”也能发光,研究人员:或用于家庭照明及显示
- rgba与16进制互相转换
- 微运行库2015_vc2015运行库下载-Visual C++ 2015(vc2015)下载V14.0.24123 官方版【32位|64位|】-西西软件下载...
- 【长难句分析精讲】状语从句
- 线程有哪些状态?每个状态是什么意思?又是如何切换的?
- double函数和int函数
- Windos 前后端项目的部署
- linux版印象笔记 for deepin
- 就GIS二次开发的一些看法
- 凌阳DVD sunplus sphe8202系列编译环境的搭建