File: memory-use

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 (118 lines) | stat: -rw-r--r-- 2,790 bytes parent folder | download | duplicates (3)
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use strict;
use warnings;
use autodie;

use v5.16;

use Getopt::Long;
use JSON::XS;
use Math::Int128 qw( uint128 );
use MaxMind::DB::Writer::Tree;
use Memory::Stats;
use Net::Works::Network;
use Number::Format qw( format_bytes );

my $ipv6_offset = uint128('0xA000_0000_0000_0000_0000_0000_0000_0000');

sub main {
    my $inserts = 10_000;
    my $source;
    GetOptions(
        'inserts:i' => \$inserts,
        'source:s'  => \$source,
    );

    my $stats = Memory::Stats->new();
    $stats->start();

    my $tree = MaxMind::DB::Writer::Tree->new(
        ip_version            => 6,
        database_type         => 'Test',
        description           => { en => 'Test' },
        languages             => ['en'],
        map_key_type_callback => sub { 'utf8_string' },
        record_size           => 24,
        alias_ipv6_to_ipv4    => 1,
    );

    if ($source) {
        _insert_data_from_json( $tree, $inserts, $source );
    }
    else {
        _insert_generated_data( $tree, $inserts );
    }

    my $used;
    $stats->stop();
    say 'Memory used before write: ',
        format_bytes( $used = $stats->get_memory_usage() );

    $stats->start();

    open my $fh, '>', '/dev/null';
    $tree->write_tree($fh);
    close $fh;

    $stats->stop();

    say 'Memory used after write: ',
        format_bytes( $used + $stats->get_memory_usage() );
}

sub _insert_data_from_json {
    my $tree    = shift;
    my $inserts = shift;
    my $source  = shift;

    open my $fh, '<', $source;

    my $json = JSON::XS->new()->utf8();

    while (<$fh>) {
        last if $. > $inserts;

        my ( $network, $record ) = @{ $json->decode($_) };

        $tree->insert_network(
            Net::Works::Network->new_from_string( string => $network ),
            $record
        );
    }
}

sub _insert_generated_data {
    my $tree    = shift;
    my $inserts = shift;

    for my $int ( 1 .. $inserts ) {
        my $ipv4 = Net::Works::Network->new_from_integer(
            integer       => $int,
            prefix_length => 128,
            version       => 6,
        );

        my %records;
        for my $i ( 1 .. 5 ) {
            $records{ipv4}{ 'thing' . $i } = {
                'ipv4_key1-' . $i => $int,
                'ipv4_key2-' . $i => { nested => "Foo $int-$i ipv4" },
            };

            $records{ipv6}{ 'thing' . $i } = {
                'ipv6_key1-' . $i => $int,
                'ipv6_key2-' . $i => { nested => "Foo $int-$i ipv6" },
            };
        }

        $tree->insert_network( $ipv4 => $records{ipv4} );

        my $ipv6 = Net::Works::Network->new_from_integer(
            integer     => $int + $ipv6_offset,
            mask_length => 128,
        );

        $tree->insert_network( $ipv6 => $records{ipv6} );
    }
}

main();