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:
parent
9730816c38
commit
dfab33e8da
2 changed files with 17 additions and 8 deletions
|
@ -73,13 +73,15 @@
|
||||||
-include_lib("eunit/include/eunit.hrl").
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
|
||||||
-define(HASH_SIZE, 4).
|
-define(HASH_SIZE, 4).
|
||||||
|
-define(XXSMALL, {6, 64, 64 * 64}).
|
||||||
|
-define(XSMALL, {7, 128, 128 * 128}).
|
||||||
-define(SMALL, {8, 256, 256 * 256}).
|
-define(SMALL, {8, 256, 256 * 256}).
|
||||||
-define(MEDIUM, {9, 512, 512 * 512}).
|
-define(MEDIUM, {9, 512, 512 * 512}).
|
||||||
-define(LARGE, {10, 1024, 1024 * 1024}).
|
-define(LARGE, {10, 1024, 1024 * 1024}).
|
||||||
-define(XLARGE, {11, 2048, 2048 * 2048}).
|
-define(XLARGE, {11, 2048, 2048 * 2048}).
|
||||||
|
|
||||||
-record(tictactree, {treeID :: any(),
|
-record(tictactree, {treeID :: any(),
|
||||||
size :: small|medium|large|xlarge,
|
size :: xxsmall|xsmall|small|medium|large|xlarge,
|
||||||
width :: integer(),
|
width :: integer(),
|
||||||
bitwidth :: integer(),
|
bitwidth :: integer(),
|
||||||
segment_count :: integer(),
|
segment_count :: integer(),
|
||||||
|
@ -139,10 +141,9 @@ import_tree(ExportedTree) ->
|
||||||
[{<<"level1">>, L1Base64},
|
[{<<"level1">>, L1Base64},
|
||||||
{<<"level2">>, {struct, L2List}}]} = ExportedTree,
|
{<<"level2">>, {struct, L2List}}]} = ExportedTree,
|
||||||
L1Bin = base64:decode(L1Base64),
|
L1Bin = base64:decode(L1Base64),
|
||||||
Sizes = [{small, element(2, ?SMALL)},
|
Sizes =
|
||||||
{medium, element(2, ?MEDIUM)},
|
lists:map(fun(SizeTag) -> {SizeTag, element(2, get_size(SizeTag))} end,
|
||||||
{large, element(2, ?LARGE)},
|
[xxsmall, xsmall, small, medium, large, xlarge]),
|
||||||
{xlarge, element(2, ?XLARGE)}],
|
|
||||||
Width = byte_size(L1Bin) div ?HASH_SIZE,
|
Width = byte_size(L1Bin) div ?HASH_SIZE,
|
||||||
{Size, Width} = lists:keyfind(Width, 2, Sizes),
|
{Size, Width} = lists:keyfind(Width, 2, Sizes),
|
||||||
{BitWidth, Width, SegmentCount} = get_size(Size),
|
{BitWidth, Width, SegmentCount} = get_size(Size),
|
||||||
|
@ -275,7 +276,9 @@ merge_trees(TreeA, TreeB) ->
|
||||||
|
|
||||||
MergedTree#tictactree{level1 = NewLevel1, level2 = NewLevel2}.
|
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
|
%% @doc
|
||||||
%% Return the segment ID for a Key. Can pass the tree size or the actual
|
%% Return the segment ID for a Key. Can pass the tree size or the actual
|
||||||
%% segment count derived from the size
|
%% segment count derived from the size
|
||||||
|
@ -297,6 +300,10 @@ tictac_hash(Key, Term) ->
|
||||||
|
|
||||||
get_size(Size) ->
|
get_size(Size) ->
|
||||||
case Size of
|
case Size of
|
||||||
|
xxsmall ->
|
||||||
|
?XXSMALL;
|
||||||
|
xsmall ->
|
||||||
|
?XSMALL;
|
||||||
small ->
|
small ->
|
||||||
?SMALL;
|
?SMALL;
|
||||||
medium ->
|
medium ->
|
||||||
|
@ -357,6 +364,8 @@ merge_binaries(BinA, BinB) ->
|
||||||
|
|
||||||
|
|
||||||
simple_bysize_test() ->
|
simple_bysize_test() ->
|
||||||
|
simple_test_withsize(xxsmall),
|
||||||
|
simple_test_withsize(xsmall),
|
||||||
simple_test_withsize(small),
|
simple_test_withsize(small),
|
||||||
simple_test_withsize(medium),
|
simple_test_withsize(medium),
|
||||||
simple_test_withsize(large),
|
simple_test_withsize(large),
|
||||||
|
|
|
@ -305,11 +305,11 @@ many_put_compare(_Config) ->
|
||||||
|
|
||||||
|
|
||||||
index_compare(_Config) ->
|
index_compare(_Config) ->
|
||||||
TreeSize = small,
|
TreeSize = xxsmall,
|
||||||
LS = 2000,
|
LS = 2000,
|
||||||
JS = 50000000,
|
JS = 50000000,
|
||||||
SS = testutil:sync_strategy(),
|
SS = testutil:sync_strategy(),
|
||||||
SegmentCount = 256 * 256,
|
SegmentCount = 64 * 64,
|
||||||
|
|
||||||
% Test requires multiple different databases, so want to mount them all
|
% Test requires multiple different databases, so want to mount them all
|
||||||
% on individual file paths
|
% on individual file paths
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue