这篇文章很可能是OpenHFT的常见问题解答中的好候选者。
我正在尝试使用ChronicleMap来考虑一个想法,但有很多问题。我相信大多数正在研究该产品的初级程序员都有类似的疑虑。
你能解释一下这个API中内存是如何管理的吗?
ChronicleMap宣称拥有一些非常出色的离堆内存资源用于处理其数据,我想对此有一个清晰的认识。
让我们假设一个有500GB硬盘和4GB RAM的笔记本电脑程序员。在这种情况下,纯数学显示 - '交换'内存可用总资源量为504GB。让我们留一半给操作系统和其他程序,那么我们剩下250GB硬盘和2GB RAM。您能详细说明与可用资源相关的ChronicleMap可以分配的实际可用内存吗?
下一个相关的问题与ChronicleMap的实现有关。
我的理解是,每个ChronicleMap都会分配一个它所使用的内存块,并且当我们能够准确地预测通过的数据量时,就可以实现最佳性能/内存使用率。然而,这是一个动态的世界。
让我们设置一个(夸张但可能的)例子:
假设一个包含K(键)“城市”和它们的V(值)-“城市描述”的地图,并允许用户使用大量的描述长度限制。
第一个用户输入:
现在,下一个用户写了一篇关于布拉格的文章。 他传递了:
ChronicleMap会自动为这种情况分配内存吗?如果是,是否有更好的方法声明ChronicleMaps以解决此动态解决方案?如果不是,您会推荐一种方法(最好提供代码示例)来处理这种情况吗?
这在持久性文件中如何工作?
ChronicleMaps会耗尽我的RAM和/或磁盘空间吗?避免这种情况的最佳实践是什么?
换句话说,请解释在低估值和高估值的情况下(键和/或值的长度和条目数),内存是如何管理的。
这些哪些适用于ChronicleMap?
1. 如果我分配了大块(
会发生什么?
1.1 - 一切正常,但会有很多未使用的大块吗?
1.2 - 一切正常,未使用的内存可用于:
1.2.1- ChronicleMap 1.2.2- 使用ChronicleMap的给定线程
1.2.3- 给定进程
1.2.4- 给定JVM
1.2.5- 操作系统
1.3 - 请解释未使用的内存是否会发生其他情况
1.4 - 过大的声明对我的持久性文件有什么影响?
2. 与情况1相反-我分配了小块(
会发生什么?
我正在尝试使用ChronicleMap来考虑一个想法,但有很多问题。我相信大多数正在研究该产品的初级程序员都有类似的疑虑。
你能解释一下这个API中内存是如何管理的吗?
ChronicleMap宣称拥有一些非常出色的离堆内存资源用于处理其数据,我想对此有一个清晰的认识。
让我们假设一个有500GB硬盘和4GB RAM的笔记本电脑程序员。在这种情况下,纯数学显示 - '交换'内存可用总资源量为504GB。让我们留一半给操作系统和其他程序,那么我们剩下250GB硬盘和2GB RAM。您能详细说明与可用资源相关的ChronicleMap可以分配的实际可用内存吗?
下一个相关的问题与ChronicleMap的实现有关。
我的理解是,每个ChronicleMap都会分配一个它所使用的内存块,并且当我们能够准确地预测通过的数据量时,就可以实现最佳性能/内存使用率。然而,这是一个动态的世界。
让我们设置一个(夸张但可能的)例子:
假设一个包含K(键)“城市”和它们的V(值)-“城市描述”的地图,并允许用户使用大量的描述长度限制。
第一个用户输入:
K =“阿姆斯特丹”
,V =“自行车之城”
,并使用此条目声明了地图 - 它为这个键值对设置了先例。ChronicleMap<Integer, PostalCodeRange> cityPostalCodes = ChronicleMap
.of(CharSequence.class, CharSequence.class)
.averageKey("Amsterdam")
.averageValue("City of bicycles")
.entries(5_000)
.createOrRecoverPersistedTo(citiesAndDescriptions);
现在,下一个用户写了一篇关于布拉格的文章。 他传递了:
K =“Prague”
,V =“欧洲中心地带的100座塔城市…等等…数百万字…”
程序员预期最多有5,000个条目,但情况失控,出现了成千上万的条目。ChronicleMap会自动为这种情况分配内存吗?如果是,是否有更好的方法声明ChronicleMaps以解决此动态解决方案?如果不是,您会推荐一种方法(最好提供代码示例)来处理这种情况吗?
这在持久性文件中如何工作?
ChronicleMaps会耗尽我的RAM和/或磁盘空间吗?避免这种情况的最佳实践是什么?
换句话说,请解释在低估值和高估值的情况下(键和/或值的长度和条目数),内存是如何管理的。
这些哪些适用于ChronicleMap?
1. 如果我分配了大块(
.entries(1_000_000)
,.averageValueSize(1_000_000)
,而实际使用情况为- Entries = 100,Average Value Size = 100。会发生什么?
1.1 - 一切正常,但会有很多未使用的大块吗?
1.2 - 一切正常,未使用的内存可用于:
1.2.1- ChronicleMap 1.2.2- 使用ChronicleMap的给定线程
1.2.3- 给定进程
1.2.4- 给定JVM
1.2.5- 操作系统
1.3 - 请解释未使用的内存是否会发生其他情况
1.4 - 过大的声明对我的持久性文件有什么影响?
2. 与情况1相反-我分配了小块(
.entries(10)
,.averageValueSize(10)
),而实际使用情况是100万条目和平均值大小为数千字节。会发生什么?