Arantxa Otegi wrote:
> I have memory problems programming with perl: "out of memory!"
> 
> I have to process a lot of xml files which are in different directories
> (more than 20000 files in 110 directories). The files are quite small
> (almost all of them are smaller than 100KB).
> Here is some code:
> 
> #### code
> #####################################################################################
> 
> use strict;
> use Expansion;
> 
> die  "Usage: doc_expansion.pl sarrera_dir irteera_dir hizkuntza_kodea
> %synset_expansioa" if ! $#ARGV == 3;
> my $sarrera_dir = $ARGV[0];
> my $irteera_dir = $ARGV[1];
> my $hizk = $ARGV[2];
> my $portzentaia = $ARGV[3];

That is usually written as:

die "Usage: $0 sarrera_dir irteera_dir hizkuntza_kodea %synset_expansioa"
    if @ARGV != 4;
my ( $sarrera_dir, $irteera_dir, $hizk, $portzentaia ) = @ARGV;


> my %variantak = Expansion::irakurri_variantak($hizk);
> 
> my @dirs;
> my $dir;
> my @fitxategiak;
> my $fitx;
> my $irt_fitx;
> my @fitx_zenb;
> my $fitx_zenb;
> 
> $| = 1;
> 
> opendir(DIR,$sarrera_dir)|| die "ezin da ireki DIR: $sarrera_dir";

You should include the $! variable in the error message so you know *why* it
failed:

opendir DIR, $sarrera_dir or die "ezin da ireki DIR: $sarrera_dir: $!";


> @dirs = readdir(DIR);

my  @dirs = readdir(DIR);


> closedir(DIR);
> 
> foreach $dir (@dirs){

foreach my $dir (@dirs){


>     next if $dir =~ /\.$/;
> 
>     opendir(DIR,"$sarrera_dir/$dir/cache_en") || die "DIR(2): 
> $sarrera_dir/$dir/cache_en" ;

You should include the $! variable in the error message so you know *why* it
failed:

     opendir DIR,"$sarrera_dir/$dir/cache_en" or die "DIR(2):
$sarrera_dir/$dir/cache_en: $!";

>     if(not -e "$irteera_dir/$dir"){

This test will never succeed because you have either opened
"$sarrera_dir/$dir/cache_en" and so it exists or the program has died.

>         mkdir("$irteera_dir/$dir",0777)|| die "DIR(2): $irteera_dir/$dir";

You should include the $! variable in the error message so you know *why* it
failed:

         mkdir "$irteera_dir/$dir", 0777 or die "DIR(2): $irteera_dir/$dir: $!";

>     }
>     if(not -e "$irteera_dir/$dir/cache_en"){

This test will never succeed because you have either opened
"$sarrera_dir/$dir/cache_en" and so it exists or the program has died.

>         mkdir("$irteera_dir/$dir/cache_en",0777)|| die "DIR(2): 
> $irteera_dir/$dir/cache_en";

You should include the $! variable in the error message so you know *why* it
failed:

         mkdir "$irteera_dir/$dir/cache_en", 0777 or die "DIR(2):
$irteera_dir/$dir/cache_en: $!";

>     }
> 
>     @fitxategiak = grep {/\.wsd$/} readdir(DIR);
>     closedir(DIR);
>     foreach $fitx (@fitxategiak){
>         print "$dir/cache_en/$fitx ....... ";
> 
>         @fitx_zenb = split(/\./,$fitx);
>         $fitx_zenb = $fitx_zenb[0];

You could simplify that as:

          my $fitx_zenb = ( split /\./, $fitx )[ 0 ];


>         $irt_fitx = "$irteera_dir/$dir/cache_en/$fitx_zenb.exp.$hizk";
>  
>         
> Expansion::fitx_expansioa("$sarrera_dir/$dir/cache_en/$fitx",$irt_fitx,$portzentaia,%variantak);
> 
>         print "$irt_fitx--$fitx_zenb.exp.$hizk\n";
>     }
> }
> -------------------------------------------------------------------------------------------
> 
> 
> package Expansion;
> use strict;
> use XML::DOM;
> 
> $| = 1;
> 
> sub fitx_expansioa{
>     my $sarfitx;
>     my $irteera_fitx;
>     my %variantak;
>     my $portzentaia;
>     ($sarfitx,$irteera_fitx,$portzentaia,%variantak) = @_;

Or more simply as:

sub fitx_expansioa {
    my ( $sarfitx, $irteera_fitx, $portzentaia, %variantak ) = @_;


>     my $dom_parser = new XML::DOM::Parser;
>     my $dok = $dom_parser->parsefile($sarfitx);
> 
>     //XML process
>     ...........
> 
>     my $irteeraXML = $dok->toString;
>     $dok->dispose;
>     open(I,">$irteera_fitx") or die "Ezin da ireki $irteera_fitx: $!";
>     print I $irteeraXML;
>     close I;
> }

perldoc perlmodlib
[ snip ]

      Try to "use warnings;" (or "use warnings qw(...);").  Remember that you
      can add "no warnings qw(...);" to individual blocks of code that need
      less warnings.

[ snip ]

      Always use -w.

      Try to "use strict;" (or "use strict qw(...);").  Remember that you can
      add "no strict qw(...);" to individual blocks of code that need less
      strictness.

      Always use -w.

      Follow the guidelines in the perlstyle(1) manual.

      Always use -w.


perldoc perlmod
[ snip ]

      ## YOUR CODE GOES HERE

      1;  # don't forget to return a true value from the file


> ##### end code
> ##############################################################################
> 
> 
> Can anybody help me to fix the problem?

I can't see anything obvious that would cause your program to run out of
memory.  Which version of perl are you running?  Which version of XML::DOM?




John
-- 
Perl isn't a toolbox, but a small machine shop where you can special-order
certain sorts of tools at low cost and in short order.       -- Larry Wall

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/


Reply via email to