perldough has asked for the wisdom of the Perl Monks concerning the following question:

I've been having some memory issues with one of my programs so I assembled this little script:

use strict; use PDL; use PDL::IO::Pic; use PDL::IO::GD; $|++; for my $i (0 .. 500) { print "$i\n"; test(); } sub test { my $path = 'largeimage.png'; my $im = PDL::IO::GD->new( {filename => $path} ); undef $im; }

It yields the following output:

0 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 PDL::IO::GD::new(): Can't read in the input file! gd-png error: cannot allocate image data

I wanted to provide the picture, but I'm at work and have no access to file hosting sites. I know there is a way to append image data to a perl script, but I haven't been able to figure it out. For you reference, the image is a 9134x6059 white png.

Does anyone know what I can do to avoid this type of crash?

Thanks,
Perldough

Replies are listed 'Best First'.
Re: Memory problems with GD
by zentara (Cardinal) on Aug 01, 2012 at 15:18 UTC
    I observe the same behavior. I tried scrubbing $im as described in "perldoc -q clear" and it still gained memory. I would ask this on the PDL maillist, where the module author frequents. You could also try a different module. Do you really need PDL::IO::GD?

    This ImageMagick script seems to hold memory down to runnable levels, although I have not taken it beyond a 20 count. :-)

    #!/usr/bin/perl use warnings; use strict; use Image::Magick; # largeimage.png is around 180 meg my $im = Image::Magick->new; # only make one object for my $i (0 .. 500) { print "$i\n"; test(); } sub test{ my $path = 'largeimage.png'; $im->Read($path); undef @$im; #needed if $im is created outside loop }

    I'm not really a human, but I play one on earth.
    Old Perl Programmer Haiku ................... flash japh

      ImageMagick looks good except that it's not immediately obvious how one could convert an ImageMagick object to a piddle, a functionality that I absolutely require.

      As you know :P, I've taken this discussion to the PDL mailing list, as per your suggestion.

      Thanks,
      Perldough
        Just for the sake of anyone searching this, the $im->Destroy; method works, instead of undef $im. I thought I tried Destroy and it didn't work, but I must have made a typo and used destroy instead of Destroy.

        I'm not really a human, but I play one on earth.
        Old Perl Programmer Haiku ................... flash japh