Perl脚本执行不断被杀 - 内存不足

coo*_*490 1 linux memory perl kill process

我正在尝试执行一个perl脚本来处理一个小的12 x 2文本文件(大约260字节)和一个大的.bedgraph文件(大小至少为1.3 MB).从这两个文件中,脚本输出一个新的bedgraph文件.

我已经在另外3个.bedgraph文件上运行了这个脚本,但是我尝试在其余的进程中运行它Killed.

perl脚本平均需要大约20分钟才能在每个.bedgraph文件上运行.

我在本地计算机上运行perl脚本(而不是从服务器运行).我正在使用Linux OS Ubuntu 12.04系统64位4GB RAM.

为什么我的perl脚本执行会被杀死,我该如何解决?

这是脚本:

# input file handle
open(my $sizes_fh, '<', 'S_lycopersicum_chromosomes.size') or die $!;

# output file handles
open(my $output, '+>', 'tendaysafterbreaker_output.bedgraph') or die $!;

my @array;

while(<$sizes_fh>){
    chomp;
    my ($chrom1, $size) = split(/\t/, $_);
    @array = (0) x $size;

    open(my $bedgraph_fh, '<', 'Solanum_lycopersicum_tendaysafterbreaker.bedgraph') or die $!;
    while(<$bedgraph_fh>){
        chomp;
        my ($chrom2, $start, $end, $FPKM) = split(/\t/, $_);

        if ($chrom1 eq $chrom2){
            for(my $i = $start; $i < $end; $i++){
                $array[$i] += $FPKM;
            }
        }
    }

    close $bedgraph_fh or warn $!;

    my ($last_start, $last_end) = 0;
    my $last_value = $array[0];

    for (my $i = 1; $i < $#array; $i++){
        my $curr_val = $array[$i];
        my $curr_pos = $i;

        # if the current value is not equal to the last value
        if ($curr_val != $last_value){
            my $last_value = $curr_val;
            print $output "$chrom1\t$last_start\t$last_end\t$last_value\n";
            $last_start = $last_end = $curr_pos;
        } else {
            $last_end = $i;
        }
    }
}

close $sizes_fh or warn $!;
Run Code Online (Sandbox Code Playgroud)

小智 5

您正在尝试分配一个包含90,000,000个元素的数组.由于其灵活的键入和其他高级变量功能,Perl使用了比预期更多的内存.

在我的(Windows 7)机器上,一个只分配这样一个数组并且什么都不做的程序会占用3.5 GB的RAM.

有各种方法可以避免这种巨大的内存使用.这是一对夫妇:

PDL用于科学数据处理模块,旨在有效地将大量数字数组存储在内存中.这将改变分配和使用数组的语法(并且它以各种其他方式使用Perl的语法).

DBM::Deep 是一个在文件中分配数据库的模块 - 然后允许您通过普通数组或散列访问该数据库:

use DBM::Deep;
my @array;
my $db = tie @array, "DBM::Deep", "array.db";

#Now you can use @array like a normal array, but it will be stored in a database.
Run Code Online (Sandbox Code Playgroud)