在OpenHTF ChronicleMap上设置最大条目

时间:2017-08-17 21:24:02

标签: java chronicle chronicle-map

我正在玩ChronicleSet,它由ChronicleMap支持。我做了一些初步测试,这对我们的需求非常好。 RAM使用效率比其他解决方案高得多,访问时间稍慢,但仍然非常快。

但是,我正在测试的一件事是设置最大条目数,它似乎没有按预期工作。

我正在使用以下代码:

    ChronicleSetBuilder<Long> postalSetBuilder =
            ChronicleSetBuilder.of(Long.class)
                    .name("long-map")
                    .entries(2_000_000L)
                    .maxBloatFactor(1.0);

根据文档,这意味着在这种情况下允许的最大条目数为2M。但是,在测试时,我可以可靠地达到指定的最大值的2倍,并且可以有一点点,直到我得到这样的异常:

Error: ChronicleMap{name=city-postal-codes-map, file=null, identityHashCode=3213500}: Attempt to allocate #129 extra segment tier, 128 is maximum.
Possible reasons include:
    - you have forgotten to configure (or configured wrong) builder.entries() number
    - same regarding other sizing Chronicle Hash configurations, most likely maxBloatFactor(), averageKeySize(), or averageValueSize()
    - keys, inserted into the ChronicleHash, are distributed suspiciously bad. This might be a DOS attack

在这种情况下,ChronicleMap对象调用size()吐出4,079,238。所以我想知道如何设置一个显式限制(如上面指定的2M),并让Chronicle可靠地拒绝任何在此之后添加其他元素的请求。

1 个答案:

答案 0 :(得分:4)

由于无共享分段存储,因此无法配置条目的确切特定限制,因此没有单个条目计数器。要使Chronicle Map无法关闭到配置的条目()限制,您应该配置public static function getOptionsArray() { $result = []; foreach (self::getOptionArray() as $index => $value) { $result[] = ['value' => $index, 'label' => $value]; } return $result; }