summaryrefslogtreecommitdiff
path: root/lmdb.pl
diff options
context:
space:
mode:
Diffstat (limited to 'lmdb.pl')
-rwxr-xr-xlmdb.pl40
1 files changed, 40 insertions, 0 deletions
diff --git a/lmdb.pl b/lmdb.pl
new file mode 100755
index 0000000..9daaaf1
--- /dev/null
+++ b/lmdb.pl
@@ -0,0 +1,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';