ChronicleMap的GitHub肯定有关于ChronicleMap中 Multimaps 的免责声明:
纪事地图不是......
......没有二级索引.
多图.使用
ChronicleMap<K, Collection<V>>as multimap在技术上是可行的,但往往会导致问题......
不幸的是,这是我的一个用例,并且使用堆外存储(使用ChronicleMap)肯定是最简单的方法.
让我试着用披萨来解释我的问题.我有10万种不同的比萨饼.每个披萨都有一个ID和许多不同的浇头和面包皮.我有三种访问模式:
我可以用a轻松存放比萨饼ChronicleMap<UUID,Pizza>.但这只是一种访问模式.我不想遍历每一个披萨,找到具有匹配的顶部或外壳的披萨.所以,我想存储的东西像ChronicleMap<Topping,Collection<UUID>>和ChronicleMap<Crust,Collection<UUID>>.
然后,如果有人问我所有的意大利辣香肠披萨,我会在顶部的ChronicleMap中查找匹配的比萨饼的UUID,然后在主披萨地图中.
但上面引用的文档让我感到害怕.有谁知道这些事情经常导致的"问题"是什么?我为什么不这样做,即使它似乎对我有用?它是否与ChronicleMap如何存储序列化对象(特别是集合)有关?
针对潜在问题的一些补充说明:
我对堆外内存的工作原理有点困惑。我有一台具有 32GB 内存的服务器,以及一个大小约为 1TB 的键值映射数据集。我正在寻找一个简单而快速的嵌入式 Java 数据库,它允许我根据这个 1TB 数据集将键映射到值,而该数据集大部分必须从磁盘读取。该数据集中的每个条目都很小(<500 字节),因此我认为使用文件系统效率低下。
我想为此使用历史地图。我读到堆外内存使用量可能会超过 RAM 大小,并且它以某种方式与文件系统交互,但与此同时,Chronicle Map 被描述为内存数据库。Chronicle Map 可以为我的服务器处理 1TB 数据集吗?还是我只能使用 32GB 或更少的数据集?
我是编年史的新手.我正在尝试使用chronicle-map对离堆映射进行建模,其中键是原始short,值是原始长数组.对于给定的映射,长数组值的最大大小是已知的.但是我将有多个这种类型的映射,每个映射对于长数组值可能具有不同的最大大小.我的问题涉及密钥和值的序列化/反序列化.
从阅读文档我明白,对于密钥,我可以使用值类型ShortValue并重用该接口的实现实例.关于值,我找到了关于DataAccess和SizedReader的页面,它给出了byte []的一个例子,但我不确定如何将它改编为long [].我有一个额外的要求是我需要在长数组中的任意索引处获取和设置值,而无需每次都支付整个值的完整序列化/反序列化的成本.
所以我的问题是:如何构建地图时我如何建模值类型?如果每个地图知道最大尺寸并且我需要能够随机读写,那么我需要为long []数组设置什么序列化/反序列化代码每次没有序列化/反序列化整个值有效负载的索引?理想情况下,long []将直接编译/解码到堆外,而不会在堆上中间转换为byte [],并且chronicle-map代码也不会在运行时分配.谢谢.
这篇文章很可能是 OpenHFT 常见问题的一个很好的候选人。
我正在玩 ChronicleMap 考虑它的一个想法,但有很多问题。我相信大多数正在研究这个产品的初级程序员都有类似的考虑。
你能解释一下这个 API 是如何管理内存的吗?
ChronicleMap 宣布了一些显着的 TB 堆外内存资源可用于处理其数据,我想对此有一个清晰的认识。
让我们来看看一个程序员,它有一台 500GB HD 和 4GB RAM 的笔记本电脑。在这种情况下,纯数学 sais - 可用“交换”内存的总资源为 504GB。让我们给操作系统和其他程序一半,我们只剩下 250GB 硬盘和 2GB 内存。您能否详细说明 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);
Run Code Online (Sandbox Code Playgroud)
现在,下一个用户被带走并写了一篇关于布拉格的分析他传递给:K = "Prague",V = "City of 100 towers is located in …
需要一些关于编年史地图如何工作的信息,是否像它在内存中保留一些键值对,当它溢出一个特定的阈值时,它会如何存储值,然后它会将数据溢出到磁盘,或者它取决于内存大小,如果地图的大小增长到阈值以上然后将数据溢出到磁盘,如果是这样,那么如何配置它,或者还有其他策略吗?
我们有一个系统,在50个服务器上使用相同的数据集(键值对).此数据集的更新次数约为每小时1000次,必须在这50台服务器之间进行复制.我们有一个主系统接收这些更新,并负责将这些更新传播到其他服务器.目前,我们每小时以文件的形式将整个数据集(而不是增量更新)同步到所有服务器.然后将该数据加载到不可变的Koloboke映射中.每个服务器每秒处理大约25000个请求,每个请求对此映射执行30次查找.在这些服务器上接收的请求的平均响应延迟最大约为3毫秒,因此内存中的koloboke映射可以很好地维持这个响应时间.
但是,我们当前在服务器之间同步此数据的系统会导致问题:
1)大多数情况下,这些关键数据的同步在其中一台服务器上失败,导致收入损失
2)由于这些数据存储在内存中,因此它不是持久性的,我们需要在每次服务器重新启动时或每次每小时更新时重新加载这些数据,这会影响应用程序的启动时间.
为了提高效率,我在Koloboke库中探索了Redis,Chronicle Maps和Mutable地图.但是我遇到了所有这些问题的限制:
Redis:Redis支持复制和持久性.但是,在使用其基准测试实用程序时,我发现它可以支持的查找次数仅略高于我们的平均用例(0.8-1.1百万个请求,而不是75万,这是我们每秒的查找次数).此外,通过网络调用redis会损害我们3ms的平均响应时间.
Chronicle Maps:在进一步探索这个问题时,我发现Chronicle Maps支持复制,持久性并且每秒可以服务多达3000万个请求.起初看起来它似乎是一个不错的选择,但后来我发现它们不适用于多图,我们在应用程序中生成它们.此外,它们将数据存储在堆外,因此数据反序列化的成本会导致性能损失.
Koloboke:它的性能很好,可以满足我们的使用需求,但不支持复制和持久性.
我找不到任何支持我们所有用例的东西.我正在寻找这个社区的建议,这些建议可以帮助我们有效地构建这个系统,而不会对性能产生任何严重影 任何有关这方面的帮助将非常感谢!谢谢!
我正在处理非常大的小物件集合.我正在使用ChronicleMap表现非常好的使用.
地图条目的最大数量是否限制为Integer.MAX_VALUE?
如果不是,如果条目数高于?,如何获得地图的实际大小作为map.size()返回?Integer.MAX_VALUEInteger.MAX_VALUE
提前致谢.
我只是尝试ChronicleMap并立即遇到一个问题,"UnsupportedClassVersionError:Unsupported major.minor version 52.0".
我正在使用Java 7 ...我是否应该将此错误解释为表示Chronicle Map是在Java 8下编译的?我是否需要下载源代码并在Java 7下编译来解决此问题(这甚至可以工作)?