日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/3 java 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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映射的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。