File: freeze-thaw

package info (click to toggle)
libmaxmind-db-writer-perl 0.300004-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,572 kB
  • sloc: ansic: 3,059; perl: 2,902; makefile: 5; sh: 4
file content (96 lines) | stat: -rw-r--r-- 2,232 bytes parent folder | download
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,
    };
}