这篇文章可能是 OpenHFT 常见问题的一个很好的候选者。
我正在玩 ChronicleMap 考虑它的一个想法,但有很多问题。我相信大多数研究这个产品的初级程序员都有类似的考虑。
您能解释一下这个 API 是如何管理内存的吗?
ChronicleMap 宣称有一些出色的 TB 堆外内存资源可用于处理其数据,我想对此有一个清晰的认识。
让我们来看看一个拥有 500GB HD 和 4GB RAM 的笔记本电脑的程序员。在这种情况下,纯数学 sais - 可用“交换”内存的总资源为 504GB。让我们将操作系统和其他程序减半,剩下 250GB HD 和 2GB RAM。您能否详细说明 ChronicleMap 可以相对于可用资源分配的实际可用内存?
下一个相关问题与 ChronicleMap 的实现有关。
我的理解是,每个 ChronicleMap 分配它使用的内存块,并且当我们可以准确预测通过的数据量时,可以实现最佳性能/内存使用。然而,这是一个动态的世界。
让我们设置一个(夸张但可能的)示例:
假设 K(关键)“城市”及其 V(值)-“描述”(城市)的地图,并允许用户对描述长度有很大限制。
第一个用户输入: K = "Amsterdam"
,V = "City of bicycles"
这个条目用于声明地图 - 它为这样的对设置了先例:
ChronicleMap<Integer, PostalCodeRange> cityPostalCodes = ChronicleMap
.of(CharSequence.class, CharSequence.class)
.averageKey("Amsterdam")
.averageValue("City of bicycles")
.entries(5_000)
.createOrRecoverPersistedTo(citiesAndDescriptions);
现在,下一个用户被带走并写了一篇关于布拉格的分析他传递给:K = "Prague"
,V = "City of 100 towers is located in the hard of Europe ... blah, blah... million words ..."
现在程序员预计最多 5_000 个条目,但它失去了他的控制,并且有数千个条目。
ChronicleMap 会为这种情况自动分配内存吗?如果是的话,有没有更好的方法为这个动态解决方案声明 ChronicleMaps?如果不是,您会推荐一种方法(最好的代码示例)如何最好地处理这种情况?
这如何与持久性文件一起工作?
ChronicleMaps 会耗尽我的 RAM 和/或磁盘空间吗?避免这种情况的最佳做法?
换句话说,请解释在低估和高估值(和/或键)长度和条目数的情况下如何管理内存。
哪些适用于 ChronicleMap?
- 如果我分配大块 (
.entries(1_000_000)
,.averageValueSize(1_000_000)
实际使用量是 - Entries = 100,Average Value Size = 100。
怎么了?:
1.1。- 一切正常,但会有大块浪费 - 未使用?
1.2. - 一切正常,未使用的内存可用于:
1.2.1 - 编年史地图
1.2.2 - 给定线程使用 ChronicleMap
1.2.3 - 给定进程
1.2.4 - 给定 JVM
1.2.5 - 操作系统
1.3. - 请解释未使用的内存是否发生其他情况
1.4. - 过大的声明对我的持久性文件有什么影响?
- 与案例1相反 - 我分配了小块 (
.entries(10)
,.averageValueSize(10)
实际使用量为 1_000_000s 个条目,平均值大小 = 1_000s 个字节。会发生什么?: