データベースから約 7000 個のオブジェクトを受け取り、各項目を JSON ファイルに書き込みます。約 2000 個のオブジェクトの後、perl はOut of memory
エラーで終了します。最初に、すべてのデータベース オブジェクトが受信され、明らかに完全にメモリに収まります。エラーはループ中に発生します。
私はperlを初めて使用し、なぜこれが起こるのかわかりません。私の観点からは、各反復後に解放できないループ内のメモリ割り当てはありません。
これが私のコードです:
use lib '../AcePerl/blib/lib','../AcePerl/blib/arch';
use Ace;
use JSON;
use Data::Structure::Util qw( unbless );
use List::MoreUtils;
use strict vars;
use constant HOST => $ENV{ACEDB_HOST} || 'mining.wormbase.org';
use constant PORT => $ENV{ACEDB_PORT} || 2005;
$|=1;
my $json = JSON->new->allow_nonref;
print "Opening the database....";
my $db = Ace->connect(-host=>HOST,-port=>PORT
-cache => {
cache_root => '/usr/tmp/acedb',
cache_depth => 4,
default_expires_in => '1 week'
}
) || die "Connection failure: ",Ace->error;
print "done.\n";
#my @anatomies = $db->list('Anatomy_Term','WBbt:000547*');
my @anatomies = $db->fetch(-name => '*',
-class => 'Anatomy_Term',
-fill => true,
# -count => 10
);
#my @anatomies = $db->list('Anatomy_Term','*');
print scalar(@anatomies), " anatomy terms found!\n";
my $i = 0;
my $c;
sub wbstr {
my $arg = $_[0];
if(!defined $arg) {
return undef;
}else{
return $arg->name;}
}
# parse anatomy terms for cells
my %anatomy_data;
open (MYFILE, '>anatomy-data2.txt');
print MYFILE '{';
my $parent;
my $first;
my $ancestor;
my $expr_ancestor;
my $is_a;
foreach $c (@anatomies) {
if($i!=0) {
print MYFILE ',';
}
$i++;
print MYFILE $json->encode(wbstr($c)), ':{';
print MYFILE '"term":', $json->encode(wbstr($c->Term)), ',';
print MYFILE '"definition":', $json->encode(wbstr($c->Definition)), ',';
print MYFILE '"synonym":', $json->encode(wbstr($c->Synonym)), ',';
print MYFILE '"parents":[';
$first = true;
foreach $parent ($c->CELL_p) {
if($first eq false) {
print MYFILE ',';
}
print MYFILE $json->encode(wbstr($parent));
$first = false;
}
print MYFILE '],';
print MYFILE '"ancestors":[';
$first = true;
foreach $ancestor ($c->Ancestor) {
if($first eq false) {
print MYFILE ',';
}
print MYFILE $json->encode(wbstr($ancestor));
$first = false;
}
print MYFILE '],';
print MYFILE '"expr_ancestors":[';
$first = true;
foreach $expr_ancestor ($c->Expr_ancestor) {
if($first eq false) {
print MYFILE ',';
}
print MYFILE $json->encode(wbstr($expr_ancestor));
$first = false;
}
print MYFILE '],';
print MYFILE '"is_a":[';
$first = true;
foreach $is_a ($c->IS_A_p) {
if($first eq false) {
print MYFILE ',';
}
print MYFILE $json->encode(wbstr($is_a));
$first = false;
}
print MYFILE ']}';
}
print MYFILE '}';
print "Done\n";
close (MYFILE);