0

我正在创建多个编年史地图只是为了避免线程之间的争用。我有 10 个线程需要缓存中的某些内容。使用单个缓存时,我观察到 putAll() [puting 2016 double[3][2] 数组)每 putAll] 次(最多 2.6 秒)持续增加。所以我放入了 10 个缓存,通过使缓存中的键永远不会与另一个线程发生冲突来避免争用。GC 暂停时间长达 45 秒,而单个编年史地图的暂停时间约为 50 毫秒。

  private final ChronicleMap<CharSequence, double[][]>[] cache = new ChronicleMap[totalCaches];

    for (int i = 0; i < totalCaches; i++) {
      try {
        cache[i] =
            ChronicleMap.of(CharSequence.class, double[][].class)
                .entriesPerSegment(1000000)
                .averageKeySize(44.0)
                .averageValueSize(119.0)
                .entries(40320000)
                .maxBloatFactor(10.0)
                .name(CACHE_NAME.concat(String.valueOf(i)))
                .putReturnsNull(true)
                .createOrRecoverPersistedTo(
                    new File(
                        "/var/opt/cache/"
                            .concat(CACHE_NAME)
                            .concat(String.valueOf(i))
                            .concat(".dat")));
      } catch (final IOException e) {
        LOGGER.error("GA cache init error", e);
      }
    }

另一个问题是我尝试用 double[][] 对象指定 constantValueBySample 并抛出异常,指出值大小应为 119,这没有意义。

    double[][] sample = new double[][]{{Math.random(), Math.random()},
                                       {Math.random(), Math.random()},
                                       {Math.random(), Math.random()}}; 
    for (int i = 0; i < totalCaches; i++) {
      try {
        cache[i] =
            ChronicleMap.of(CharSequence.class, double[][].class)
                .entriesPerSegment(1000000)
                .averageKeySize(44.0)
                .constantValueSizeBySample(sample)
                .entries(40320000)
                .maxBloatFactor(10.0)
                .name(CACHE_NAME.concat(String.valueOf(i)))
                .putReturnsNull(true)
                .createOrRecoverPersistedTo(
                    new File(
                        "/var/opt/cache/"
                            .concat(CACHE_NAME)
                            .concat(String.valueOf(i))
                            .concat(".dat")));
      } catch (final IOException e) {
        LOGGER.error("GA cache init error", e);
      }
    }
4

0 回答 0