From 9615462dee161c04da5f0433556007f4d503143a Mon Sep 17 00:00:00 2001 From: leventov Date: Fri, 26 Dec 2014 15:01:01 +0700 Subject: [PATCH] Fixed estimateSegmentsBasedOnSize should base on the value size, not chunk --- .../chronicle/map/ChronicleMapBuilder.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java index c95de1080..c8afdf9e0 100755 --- a/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java +++ b/src/main/java/net/openhft/chronicle/map/ChronicleMapBuilder.java @@ -695,16 +695,21 @@ public final class ChronicleMapBuilder implements Cloneable, return (int) Math.min(Maths.nextPower2(entries() / 32, 1), estimateSegmentsBasedOnSize()); } + //TODO reivew because this heuristic doesn't seem to perform well private int estimateSegmentsBasedOnSize() { - // based on entries with multimap of 100 bytes. + // the idea is that if values are huge, operations on them (and simply ser/deser) + // could take long time, so we want more segment to minimize probablity that + // two or more concurrent write ops will go to the same segment, and then all but one of + // these threads will wait for long time. int segmentsForEntries = estimateSegmentsForEntries(entries()); - return actualChunkSize >= 1000000 + double averageValueSize = averageValueSize(); + return averageValueSize >= 1000000 ? segmentsForEntries * 16 - : actualChunkSize >= 100000 + : averageValueSize >= 100000 ? segmentsForEntries * 8 - : actualChunkSize >= 10000 + : averageValueSize >= 10000 ? segmentsForEntries * 4 - : actualChunkSize >= 1000 + : averageValueSize >= 1000 ? segmentsForEntries * 2 : segmentsForEntries; }