summaryrefslogtreecommitdiff
path: root/lmdb.pl
blob: 9daaaf1537cb0754c91d0f7b5814dcaf724b6e0a (plain)
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
#!/usr/bin/perl

# Usage:
#
#   ./lmdb.pl create dbfile <dictionary
#   ./lmdb.pl bench dbfile

use strict;
use warnings;
use v5.10;
use LMDB_File ':flags';

my($cmd, $dbfile) = @ARGV;

sub encode {
    my $env = LMDB::Env->new($dbfile, { mapsize => 1<<36, maxdbs => 1, flags => MDB_NOSUBDIR });
    my $txn = $env->BeginTxn();
    my $dbi = $txn->open('db', MDB_CREATE);
    while(<STDIN>) {
        chomp;
        $txn->put($dbi => $_, '') if length($_) && length($_) < 510;
    }
    $txn->commit;
}


sub bench {
    my $env = LMDB::Env->new($dbfile, { mapsize => 1<<32, maxdbs => 1, flags => MDB_RDONLY|MDB_NOSUBDIR });
    my $txn = $env->BeginTxn();
    my $dbi = $txn->open('db');
    my $lookup = sub { eval { $txn->get($dbi => $_[0], my $d); 1 } };

    use Benchmark 'timethis', ':hireswallclock';
    sub rstr { state $s=['a'..'z','A'..'Z','0'..'9','!','@','#']; join '', map $s->[rand @$s], 1..5 }
    srand 0;
    timethis 200000, sub { $lookup->(rstr()) }, 'lmdb';
}

encode if $cmd eq 'create';
bench if $cmd eq 'bench';