diff options
-rwxr-xr-x | lmdb.pl | 35 |
1 files changed, 28 insertions, 7 deletions
@@ -4,18 +4,25 @@ # # ./lmdb.pl create dbfile <dictionary # ./lmdb.pl bench dbfile +# ./lmdb.pl extract dbfile >dictionary use strict; use warnings; use v5.10; -use LMDB_File ':flags'; +use LMDB_File ':flags', ':cursor_op'; my($cmd, $dbfile) = @ARGV; +my($env, $txn, $dbi); + +sub db { + my $wr = shift; + $env = LMDB::Env->new($dbfile, { mapsize => 1<<36, maxdbs => 1, flags => MDB_NOSUBDIR|($wr?0:MDB_RDONLY) }); + $txn = $env->BeginTxn(); + $dbi = $txn->open('db', $wr ? MDB_CREATE : undef); +} 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); + db 1; while(<STDIN>) { chomp; $txn->put($dbi => $_, '') if length($_) && length($_) < 510; @@ -25,9 +32,7 @@ sub encode { 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'); + db; my $lookup = sub { eval { $txn->get($dbi => $_[0], my $d); 1 } }; use Benchmark 'timethis', ':hireswallclock'; @@ -36,5 +41,21 @@ sub bench { timethis 200000, sub { $lookup->(rstr()) }, 'lmdb'; } + +sub extract { + db; + my $db = LMDB_File->new($txn, $dbi); + my $cur = $db->Cursor(); + eval { + my($key, $value); + $cur->get($key, $value, MDB_FIRST); + while(1) { + print "$key\n"; + $cur->get($key, $value, MDB_NEXT); + } + } +} + encode if $cmd eq 'create'; bench if $cmd eq 'bench'; +extract if $cmd eq 'extract'; |