#java #caching #chronicle-map #hft
Вопрос:
Я создаю несколько карт хроник, чтобы избежать конфликтов между потоками. У меня есть 10 потоков, которым нужно что-то из кэша. С помощью одного кэша я наблюдал непрерывное увеличение putAll() [размещение 2016 двойных массивов[3][2]) с каждым putAll] раз (до 2,6 секунды). Поэтому я поместил 10 кэшей, избегая конфликтов, сделав так, чтобы ключи в кэше никогда не сталкивались с другим потоком. Паузы GC составили 45 секунд по сравнению с ~ 50 мс при использовании одной карты хроники.
private final ChronicleMaplt;CharSequence, double[][]gt;[] cache = new ChronicleMap[totalCaches]; for (int i = 0; i lt; 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); } }
Другая проблема заключается в том, что я попытался указать constantValueBySample с помощью объекта double [] [], и это вызвало исключение, указывающее, что размер значения должен быть 119, что не имеет смысла.
double[][] sample = new double[][]{{Math.random(), Math.random()}, {Math.random(), Math.random()}, {Math.random(), Math.random()}}; for (int i = 0; i lt; 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); } }
Комментарии:
1. Вы решаете несколько проблем в своем вопросе. Stackoverflow не предназначен для поддержки программирования и отладки. Кроме того, ваша фактическая проблема не может быть воспроизведена, так как в коде отсутствует, как на самом деле используется карта. Я предлагаю извлечь вопросы или несколько вопросов, которые соответствуют формату переполнения стека. Например, начните с проблемы разногласий.
2. @cruftex Я не ищу поддержки программирования. Просто хочу понять, поддерживает ли карта хроники несколько экземпляров в одной и той же JVM, почему она ведет себя медленно, когда количество записей на карте увеличивается, и почему она создает исключение размера, когда известно, что константа valuebysample является двойной[3][2]