诸如无处不在的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

Java:ChronicleMap第2部分,超级RAM映射相关推荐

  1. java获取ram_Java:ChronicleMap第2部分,超级RAM映射

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

  2. 重拾java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  3. 毕向东—Java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  4. Java 时间和日期类型的 Hibernate 映射

    以下情况下必须显式指定 Hibernate 映射类型 一个 Java 类型可能对应多个 Hibernate 映射类型. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hi ...

  5. 【错误记录】生成 Java 文档错误 ( Xxx.java:xx: 错误: 编码GBK的不可映射字符 )

    文章目录 一.报错信息 二.解决方案 一.报错信息 使用 javadoc 命令 , 生成 Java 文档 , 报错 ; javadoc Student.java D:\develop\javadoc& ...

  6. websockets_使用Java WebSockets,JSR 356和JSON映射到POJO的

    websockets 因此,我一直在研究Tyrus (JSR 356 WebSocket for Java规范的参考实现). 因为我一直在寻找测试工具,所以我对在Java中同时运行客户端和服务器端感兴 ...

  7. 使用Java WebSockets,JSR 356和JSON映射到POJO的

    因此,我一直在研究Tyrus (JSR 356 WebSocket for Java规范的参考实现). 因为我一直在寻找测试工具,所以我对在Java中同时运行客户端和服务器端感兴趣. 因此,恐怕此博客 ...

  8. 适用智能电表,热能表,气表等段码LCD液晶显示驱动芯片I2C 接口VK2C22A/B,RAM映射44*4, 40*4

    ---------------------------------- 永嘉微电 I²C 接口LCD 控制及驱动IC 型号: VK2C22A:RAM 映射 44*4封装(LQFP-52)  LCD液晶显 ...

  9. 【已解决】Java “错误:编码GBK 的不可映射字符”

    [已解决]Java "错误:编码GBK 的不可映射字符" 正文 import java.awt.*; import java.awt.datatransfer.Clipboard; ...

最新文章

  1. 深度学习与计算机视觉系列(9)_串一串神经网络之动手实现小例子
  2. 哈佛大学 NLP 组开源神经机器翻译系统 OpenNMT
  3. SharePoint Server 2016 部署安装(三)—— 安装SharePoint Server
  4. C语言中 怎样区分八进制 十进制 二进制?
  5. CSS块级元素和行内元素
  6. 【css】怎么让Chrome支持小于12px 的文字
  7. Github 开源了新型肺炎防疫项目,助力抗击疫情!
  8. 爬虫笔记(十四)——BeautifulSoup库
  9. 论模式在领域驱动设计中的重要性
  10. 图解 ElasticSearch 原理,写得太好了!
  11. qml 发光_“木头”也能发光,研究人员:或用于家庭照明及显示
  12. rgba与16进制互相转换
  13. 微运行库2015_vc2015运行库下载-Visual C++ 2015(vc2015)下载V14.0.24123 官方版【32位|64位|】-西西软件下载...
  14. 【长难句分析精讲】状语从句
  15. 线程有哪些状态?每个状态是什么意思?又是如何切换的?
  16. double函数和int函数
  17. Windos 前后端项目的部署
  18. linux版印象笔记 for deepin
  19. 就GIS二次开发的一些看法
  20. 凌阳DVD sunplus sphe8202系列编译环境的搭建

热门文章

  1. GDOI2018-《被虐记》
  2. 洛谷P1462-通往奥格玛瑞的路【日常图论,二分查找,最短路,SPAF】
  3. 【做题记录】[SCOI2009]围豆豆
  4. codeforces1485 F. Copy or Prefix Sum(dp)
  5. F. Paper Grading(Trie树+dfs序+二维数点)
  6. 【主席树】可持久化数组(金牌导航 可持久化数据结构-3)
  7. 21、mysql修改密码的方法总结
  8. 汇编语言(二)之数值求和
  9. 你想象中的实习是什么样的?
  10. idea中报错……的解决方式!