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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

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

發(fā)布時(shí)間:2023/12/3 java 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java获取ram_Java:ChronicleMap第2部分,超级RAM映射 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java獲取ram

諸如無處不在的HashMap類的標(biāo)準(zhǔn)Java Map最終受到可用RAM的限制。 閱讀本文并了解如何創(chuàng)建幾乎無限大小甚至超過目標(biāo)計(jì)算機(jī)RAM大小的Java Map。

內(nèi)置的Map實(shí)現(xiàn),例如HashMap和ConcurrentHashMap ,只要它們相對較小,就可以正常工作。 在所有情況下,它們都受可用堆的限制,因此最終受可用RAM大小的限制。 ChronicleMap可以將其內(nèi)容存儲在文件中,從而規(guī)避了此限制,為TB級映射打開了空間,如有關(guān)CronicleMap系列文章的第二篇文章所示。

在我之前的第一篇文章中了解有關(guān)CronicleMap基礎(chǔ)的更多信息。

文件映射

通過在ChronicleMap構(gòu)建器上調(diào)用createPersistedTo()方法來進(jìn)行文件映射,如下所示:

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);} }

這將創(chuàng)建一個(gè)Map,將其內(nèi)容布局在名為“ my-map”的內(nèi)存映射文件中,而不是直接內(nèi)存中。 以下示例說明了如何創(chuàng)建1000萬個(gè)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));

以下命令顯示了新創(chuàng)建的文件:

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

可以看出,該文件約為33 MB,因此,每個(gè)條目平均占用33個(gè)字節(jié)。

堅(jiān)持不懈

當(dāng)JVM終止時(shí),映射文件仍然存在,從而可以輕松地拾取先前創(chuàng)建的包含其內(nèi)容的映射。 這非常類似于基本的超快數(shù)據(jù)庫。 這是我們從現(xiàn)有文件開始的方法:

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

該Map將直接可用,包括以前的內(nèi)容。

Java Map超出RAM限制

內(nèi)存映射文件的一個(gè)有趣方面是,它們可以超過堆和RAM的限制。 文件映射邏輯將確保當(dāng)前使用的部件按需加載到RAM中。 映射邏輯還將在物理內(nèi)存中保留已訪問映射內(nèi)存的最近部分,以提高性能。 這發(fā)生在幕后,不需要由應(yīng)用程序本身進(jìn)行管理。

我的臺式計(jì)算機(jī)是只有16GB內(nèi)存的較舊的MacBook Pro(是的,我知道那很糟)。 不過,我可以分配一個(gè)Map其中包含10億個(gè)條目,它們可能占用33 * 1,000,000,000 = 33 GB的內(nèi)存(我們從上面記得,每個(gè)條目平均占用33個(gè)字節(jié))。 代碼如下:

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

即使我嘗試用2倍于我的RAM大小來創(chuàng)建Java Map,代碼也可以完美運(yùn)行,并得到以下文件:

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

不用說,您應(yīng)該確保要映射的文件位于具有較高隨機(jī)訪問性能的文件系統(tǒng)上。 例如,位于本地SSD上的文件系統(tǒng)。

摘要

ChronicleMap可以映射到外部文件
JVM退出時(shí)保留映射的文件
新的應(yīng)用程序可以選擇現(xiàn)有的映射文件 ChronicleMap可以容納的數(shù)據(jù)多于RAM 映射文件最好放置在隨機(jī)訪問性能高的文件系統(tǒng)上

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

java獲取ram

總結(jié)

以上是生活随笔為你收集整理的java获取ram_Java:ChronicleMap第2部分,超级RAM映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。