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';
|