summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2019-05-17 10:07:08 +0200
committerYorhel <git@yorhel.nl>2019-05-17 10:07:08 +0200
commit118c801b3569d7e69a34d9b2a83c1c10ec6a7dfa (patch)
tree2d3577b5589d4e2000fcaba8f82619d9f7f28cb8
parent02315a70c6604c6dc3f87649c387ddea5bc398de (diff)
lmdb.pl: Work around a memory leak in the extract functionHEADmaster
-rwxr-xr-xlmdb.pl21
1 files changed, 13 insertions, 8 deletions
diff --git a/lmdb.pl b/lmdb.pl
index 1e5e11f..35931eb 100755
--- a/lmdb.pl
+++ b/lmdb.pl
@@ -17,7 +17,7 @@ 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();
+ $txn = $env->BeginTxn($wr ? 0 : MDB_RDONLY);
$dbi = $txn->open('db', $wr ? MDB_CREATE : undef);
}
@@ -43,15 +43,20 @@ sub bench {
sub extract {
- db;
- my $db = LMDB_File->new($txn, $dbi);
- my $cur = $db->Cursor();
+ # This ugly periodic opening/closing of the database is to work around a
+ # memory leak somewhere.
eval {
- my($key, $value);
- $cur->get($key, $value, MDB_FIRST);
+ my $key;
while(1) {
- print "$key\n";
- $cur->get($key, $value, MDB_NEXT);
+ $env = $txn = $dbi = undef;
+ db;
+ my $db = LMDB_File->new($txn, $dbi);
+ my $cur = $db->Cursor();
+ $cur->get($key, (my $value), defined($key) ? MDB_SET_KEY : MDB_FIRST);
+ for (0..10_000) {
+ print "$key\n";
+ $cur->get($key, $value, MDB_NEXT);
+ }
}
}
}