1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
use strict;
use warnings;
use v5.16;
use utf8;
use Math::Int128 qw( uint128 );
use MaxMind::DB::Writer::Tree;
use Net::Works::Network;
use Timer::Simple;
my $cb = sub {
my $key = $_[0];
$key =~ s/X$//;
return $key eq 'array' ? [ 'array', 'uint32' ] : $key;
};
my $tree = MaxMind::DB::Writer::Tree->new(
ip_version => 6,
record_size => 24,
database_type => 'Test',
languages => ['en'],
description => { en => 'Test tree' },
merge_strategy => 'toplevel',
map_key_type_callback => $cb,
);
my $s = Timer::Simple->new( start => 1 );
my $count = int( 2**15 * 1.6 );
for my $i ( 1 .. $count ) {
my $n = Net::Works::Network->new_from_integer(
integer => $i,
prefix_length => 128,
version => 6
);
$tree->insert_network( $n, _data_record( $i % 16 ) );
}
$s->stop();
print "Built in-memory tree of $count networks in ", $s->elapsed,
" seconds\n";
$s->start();
open my $fh1, '>', 'tree1';
$tree->write_tree($fh1);
$s->stop();
print "Wrote tree to disk in ", $s->elapsed, " seconds\n";
$s->start();
my $file = './frozen';
$tree->freeze_tree($file);
$s->stop();
print "Frozen tree to disk in ", $s->elapsed, " seconds\n";
$s->start();
my $tree2 = MaxMind::DB::Writer::Tree->new_from_frozen_tree(
filename => $file,
map_key_type_callback => $cb,
);
$s->stop();
print "Thawed tree in ", $s->elapsed, " seconds\n";
$s->start();
open my $fh2, '>', 'tree2';
$tree2->write_tree($fh2);
sub _data_record {
my $i = shift;
return {
utf8_string => 'unicode! ☯ - ♫ - ' . $i,
double => 42.123456 + $i,
bytes => pack( 'N', 42 + $i ),
uint16 => 100 + $i,
uint32 => 2**28 + $i,
int32 => -1 * ( 2**28 + $i ),
uint64 => ( uint128(1) << 60 ) + $i,
uint128 => ( uint128(1) << 120 ) + $i,
array => [ 1, 2, 3, $i ],
map => {
mapX => {
utf8_stringX => 'hello - ' . $i,
arrayX => [ 7, 8, 9, $i ],
},
},
boolean => $i % 2,
float => 1.1 + $i,
};
}
|