java获取ram_Java:ChronicleMap第2部分,超级RAM映射
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阆苑仙葩读音 阆苑仙葩的意思
- 下一篇: java设计模式之装饰模式_Java中的