gawk job getting killing, too large of input?

0

Parece que não consigo entender por que um script que estou executando até agora falha em um arquivo de entrada um pouco maior.

Se eu executar o script em um arquivo que seja 820000x75 (linhas por colunas), o script funcionará bem, mas se eu executá-lo com um arquivo de 1,4 milhões x 75, o script não conseguirá imprimir nada, com o apenas mensagem de erro sendo "Matada". Estou correndo em algum limite de tamanho de awk com a minha entrada.

Aqui está o script, que deve ler apenas um arquivo de números de ponto flutuante e imprimi-los de forma diferente em outro arquivo:

BEGIN{  i=1; j=1

    getline
    getline
 }{ 
           if($3 ~ /MO/ ){
                  i=1
                  if(0=="1"){print i,j}
                  j++
                }
 else           {
                  # substr(string, start [, length ])

                  if(length($0)>"61"){

                     Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
                     Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
                     Mat[i,j]=sprintf("%.8g",substr($0,31,15)); i++
                     Mat[i,j]=sprintf("%.8g",substr($0,46,15)); i++
                     Mat[i,j]=sprintf("%.8g",substr($0,61,15)); i++

                  }
                  else if(length($0)>"46"){

                     Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
                     Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
                     Mat[i,j]=sprintf("%.8g",substr($0,31,15)); i++
                     Mat[i,j]=sprintf("%.8g",substr($0,46,15)); i++

                  }
                  else if(length($0)>"31"){

                     Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
                     Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++
                     Mat[i,j]=sprintf("%.8g",substr($0,31,15)); i++

                  }
                  else if(length($0)>"16"){

                     Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++
                     Mat[i,j]=sprintf("%.8g",substr($0,16,15)); i++

                  }
                  else if(length($0)>"1"){

                     if($0!="0"){  Mat[i,j]=sprintf("%.8g",substr($0,1,15)) ; i++  }
                     else{print "scratch.scr.readMO: a zero element was found!"}

                  }
                  else if(length($0)=="0"){ print "scratch.scr.readMO: error-0"}
                  else{ print "scratch.scr.readMO: error-2"}
                }
}
END{
                if(0=="1"){print (i-1),j}
                for (x=1; x<=(i-1); x++)
                {   for (y=1; y<=j; y++)
                    {         printf "%.8g %s ", Mat[x,y], " "    > "MOs_"label".txt"
                    }
                    if (x<(i-1)) {printf "\n "                    > "MOs_"label".txt" }
                }
}

E aqui está o comando que estou usando para executar isso:

gawk -v label=P -f script file_to_process
    
por Tyberius 31.08.2018 / 00:18

1 resposta

1

A mensagem Killed geralmente indica que o kernel matou seu processo, provavelmente devido a esgotamento de recursos (falta de memória) ou exaustão de cota (esgotamento do uso de memória permitido por ). Você pode ver as mensagens do kernel examinando os logs do sistema (normalmente /var/log/messages (ou, se você estiver lá quando o processo morrer, execute dmesg ) para obter informações sobre o motivo pelo qual o kernel decidiu seu processo teve que morrer.

    
por 31.08.2018 / 17:14

Tags