Add smaller trees

The "small" tree will serialise to 1.5MB - which seems large.  Much smaller trees seem to be more suitable for things like recently modified aae indexes.
This commit is contained in:
Martin Sumner 2017-09-25 13:07:08 +01:00
parent 9730816c38
commit dfab33e8da
2 changed files with 17 additions and 8 deletions

View file

@ -73,13 +73,15 @@
-include_lib("eunit/include/eunit.hrl").
-define(HASH_SIZE, 4).
-define(XXSMALL, {6, 64, 64 * 64}).
-define(XSMALL, {7, 128, 128 * 128}).
-define(SMALL, {8, 256, 256 * 256}).
-define(MEDIUM, {9, 512, 512 * 512}).
-define(LARGE, {10, 1024, 1024 * 1024}).
-define(XLARGE, {11, 2048, 2048 * 2048}).
-record(tictactree, {treeID :: any(),
size :: small|medium|large|xlarge,
size :: xxsmall|xsmall|small|medium|large|xlarge,
width :: integer(),
bitwidth :: integer(),
segment_count :: integer(),
@ -139,10 +141,9 @@ import_tree(ExportedTree) ->
[{<<"level1">>, L1Base64},
{<<"level2">>, {struct, L2List}}]} = ExportedTree,
L1Bin = base64:decode(L1Base64),
Sizes = [{small, element(2, ?SMALL)},
{medium, element(2, ?MEDIUM)},
{large, element(2, ?LARGE)},
{xlarge, element(2, ?XLARGE)}],
Sizes =
lists:map(fun(SizeTag) -> {SizeTag, element(2, get_size(SizeTag))} end,
[xxsmall, xsmall, small, medium, large, xlarge]),
Width = byte_size(L1Bin) div ?HASH_SIZE,
{Size, Width} = lists:keyfind(Width, 2, Sizes),
{BitWidth, Width, SegmentCount} = get_size(Size),
@ -275,7 +276,9 @@ merge_trees(TreeA, TreeB) ->
MergedTree#tictactree{level1 = NewLevel1, level2 = NewLevel2}.
-spec get_segment(any(), integer()|small|medium|large|xlarge) -> integer().
-spec get_segment(any(),
integer()|xsmall|xxsmall|small|medium|large|xlarge) ->
integer().
%% @doc
%% Return the segment ID for a Key. Can pass the tree size or the actual
%% segment count derived from the size
@ -297,6 +300,10 @@ tictac_hash(Key, Term) ->
get_size(Size) ->
case Size of
xxsmall ->
?XXSMALL;
xsmall ->
?XSMALL;
small ->
?SMALL;
medium ->
@ -357,6 +364,8 @@ merge_binaries(BinA, BinB) ->
simple_bysize_test() ->
simple_test_withsize(xxsmall),
simple_test_withsize(xsmall),
simple_test_withsize(small),
simple_test_withsize(medium),
simple_test_withsize(large),

View file

@ -305,11 +305,11 @@ many_put_compare(_Config) ->
index_compare(_Config) ->
TreeSize = small,
TreeSize = xxsmall,
LS = 2000,
JS = 50000000,
SS = testutil:sync_strategy(),
SegmentCount = 256 * 256,
SegmentCount = 64 * 64,
% Test requires multiple different databases, so want to mount them all
% on individual file paths