我正在创建多个编年史地图只是为了避免线程之间的争用。我有 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);
}
}