[librecat-dev] Catmandu(?) eating memory

Nicolas Steenlant Nicolas.Steenlant at UGent.be
Wed Mar 9 12:39:16 CET 2016


Hello Michael,

you are creating a new store and sqlite client with each call.
It would be better to keep a reference to the store in your Cat::DB instance (has => ’store’ …).

Regards,
Nicolas

--
Nicolas Steenlant
Ghent University Library

Sint-Hubertusstraat 8
9000 Gent

nicolas.steenlant at ugent.be
+32 486 62 62 27




> On 09 Mar 2016, at 12:17, Michael Kapp <limodev at yulux.de> wrote:
> 
> Hi,
> 
> the below script eating all memory.
> 
> Every two seconds it creates a hash (with test data) and put's it into a catmandu sqlite db:
> 
> my $test_dat = { map { rand($_) => 1 } 1 .. 1000 };
> my $sqlite = Cat::DB->new(data => $test_dat);
> $sqlite->create;
> 
> If I comment the line:
> 
> $self->env->add($self->data); ## eating memory
> 
> The possible memory leak stops.
> 
> I don't know what I'm doing wrong.
> 
> Are there any hints to prevent this?
> 
> thx & regards,
> Michael
> 
> ---------------------------------
> 
> package Cat::DB;
> use Mouse;
> use Catmandu::Store::DBI;
> use namespace::autoclean;
> 
> has 'data' => (
>  traits    => ['Hash'],
>  is        => 'rw',
>  required  => 1,
>  isa       => 'HashRef',
>  default   => sub { {} },
> );
> 
> sub env {
>  my $self = shift;
>  my $cstore = Catmandu::Store::DBI->new(
>        data_source => 'DBI:SQLite:database=/tmp/test.db',
>        bags => {
>          test => {
>            autocommit => 1,
>            plugins => [ 'Datestamps' ]
>          }
>        }
>      );
>  return $cstore->bag('test');
> };
> 
> sub create {
>  my $self = shift;
>  eval {
>    $self->env->add($self->data); ## eating memory
>  };
>  if (my $e = $@) {
>      print("Something went wrong: $e\n");
>      return;
>  }
> };
> 
> no Mouse;
> __PACKAGE__->meta->make_immutable;
> 1;
> 
> package main;
> use strict;
> use warnings;
> 
> my $start_time = time();
> my $wait_time = 2;
> my $never_happen = 0;
> my $seconds = 0;
> 
> do {
>    if (((time() - $start_time) % $wait_time) == 0) {
>        &create_data;
>    }
> } until ($never_happen);
> 
> 
> sub create_data {
>    print "Seconds elapsed: $seconds\n";
>    my $test_dat = { map { rand($_) => 1 } 1 .. 1000 };
>    my $sqlite = Cat::DB->new(data => $test_dat);
>    $sqlite->create;
>    sleep(1); # to stop multiple instances
>    $seconds += $wait_time;
> }
> 
> 
> _______________________________________________
> librecat-dev mailing list
> - send list mails to librecat-dev at lists.uni-bielefeld.de
> - to unsubscribe or change options, visit https://lists.uni-bielefeld.de/mailman2/cgi/unibi/listinfo/librecat-dev
> - project website: http://librecat.org/




More information about the librecat-dev mailing list