Memory management via fork is a good idea; I've used it in several situations (usually when I'm going to leak memory).
The problem WoodyWeaver may have is that when the child exits normally, it will still go through the ten hours of data structure destruction, and the parent will wait the whole time. Taking some code from davidrw and some from my own node,
use Set::Light;
my $pid = fork;
die "Can't fork: $!" if ! defined $pid;
if($pid){ # parent
my $start_time = time;
wait;
printf "Child exited after %d seconds\n", time - $start_time;
}
else { # child
my $start_time = time;
my $set = Set::Light->new();
for( my $i = 0; $i < 10_000_000; $i++ ) {
$set->insert( $i );
}
printf "Child done after %d seconds\n", time - $start_time;
exit;
}
__END__
Child done after 36 seconds
Child exited after 163 seconds
The solution to this is not to let the child exit normally (i.e., kill it). In the above code, if I change "exit" to "kill 9 => $$", the OS does the memory reclamation, and the output looks like this:
Child done after 32 seconds
Child exited after 32 seconds
|