입력이 너무 커서 gawk 작업이 종료되었나요?

입력이 너무 커서 gawk 작업이 종료되었나요?

지금까지 잘 작동하던 스크립트가 약간 더 큰 입력 파일에서는 실패하는 이유를 이해할 수 없는 것 같습니다.

820000x75(한 줄씩) 파일에서 스크립트를 실행하면 스크립트는 제대로 실행되지만 140000x75 파일에서 스크립트를 실행하면 스크립트는 아무 것도 인쇄하지 못하고 메시지가 "killed"라는 유일한 오류를 표시합니다. 내 입력이 awk의 크기 제한에 도달했습니까?

다음은 스크립트입니다. 부동 소수점 파일을 읽고 다른 방식으로 다른 파일에 인쇄해야 합니다.

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" }
                }
}

다음은 실행하는 데 사용하는 명령입니다.

gawk -v label=P -f script file_to_process

답변1

이 메시지는 Killed일반적으로 리소스 소진(메모리 부족) 또는 할당량 소진(메모리 부족)으로 인해 커널이 프로세스를 종료했음을 나타냅니다.허용된메모리 사용량). 일반적으로 커널에서 나오는 메시지를 확인하기 위해 시스템 로그를 주의 깊게 읽으면 커널이 프로세스가 종료되어야 한다고 결정한 이유를 이해할 수 있습니다 ( /var/log/messages또는 프로세스가 종료되는 것을 봤을 때 그곳에 있었다면 run ).dmesg

관련 정보