openw로 생성한 ascii file의 input/output error

게시판 IDL Q&A openw로 생성한 ascii file의 input/output error

3 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #3187 Reply
      JS
      회원

      안녕하세요.
      User group 에서 항상 많은 정보를 얻어가는 IDL 유저입니다.

      보유하고 있는 데이터를 처리하여 하루단위의 ascii 파일로 작성 및 저장하는 작업을 하는 중에 문제가 발생하여 질문드리게 되었습니다.
      데이터의 양은 ascii 파일 기준으로 약 20~30MB정도 되는 배열입니다.

      openw, 1, ‘filename~’, width=200
      for i=0L, n_elements(array)-1 do begin
      printf, 1, ‘~’, ‘~’, ‘~’, ‘~’, ‘~’, ‘~’, $
      ‘~’, ‘~’, ‘~’, $
      format='(~,~,~,~,~,’+$
      ‘~,~,~,~)’
      endfor
      close, 1

      데이터 처리 후 ascii 파일로 저장하는 부분은 간략하게 표현하면 위와 같습니다. filename, array 의 이름 및 생성할 파일에 입력할 변수 내용은 위와 다르지만 큰 문제는 되지 않는다고 생각합니다.
      이러한 내용을 1년치의 날짜에 하루단위로 for 문을 이용하여 하루단위 ascii 파일을 생성하였습니다.
      위 코드를 실행하면 에러는 발생하지 않고, 모든 과정을 거친 후 정상적으로 종료됩니다.
      그리고 생성된 ascii 파일을 readcol로 읽어보면, 대부분의 파일에서는 문제가 없지만 무작위로 임의의 파일들에서 FILE_LINES 에 대한 input/output error 이 발생합니다.
      해당 파일은 vi 편집기를 이용하여 열어보아도 파일 읽기 에러라는 상태 메시지가 표시되며, 열린 내용을 보아도 끝까지 제대로 작성되지 않고 중간에 작성이 멈춘 것 같습니다.

      해당 날짜의 데이터에 대해서만 다시 파일생성 코드를 돌리고 난 후에는 ascii 파일이 정상적으로 읽어집니다.
      ascii 파일 생성코드 실행 시 에러가 발생하지 않았음에도, 생성된 파일 중 임의의 파일들에서 에러가 발생하는 부분은 저도 처음 겪는 일이어서 여러가지 생각을 해보았습니다.
      데이터의 양이 많아서 1년치를 한 번에 돌리면 누적된 배열에 대한 메모리에 과부하가 걸리는 것이 아닌가 싶어서, 하루단위 데이터 처리 및 파일 생성하는 코드를 pro ~로 바꿔 저장하고 1년치에 대한 for문 안에서 프로시저로 실행해보았으나 해결되지 않았습니다.

      코드를 모두 보여드리지 못해 답변하시기 힘드시겠지만, 의심가는 부분이 있다면 코멘트 부탁드립니다.
      감사합니다.

    • #3188 Reply
      Jonghyuk Yi
      회원

      보여주신 위 코드의 틀에서 어색한 점은 없어 보입니다.
      20~30MB 정도는 요즘은 대용량이라고 보기는 어렵습니다. 그 문제는 아닌 듯 합니다.

      1) 프로그램을 실행 할 때마다 문제가 발생하는 파일이 달라진다는 말씀이신가요? 예를 들면, 어떤 실행에서는 3월 20일 파일이 비정상적으로 기록되고, 다음 실행에서는 3월 20일은 멀쩡한데, 6월 20일이 비정상적으로 저장되고, 그런다는 의미이신가요? 그렇다면 분명 이상한 상황이기는 합니다.

      2) 전체 상황을 잘 모르겠지만, close, 1 을 실행하지 못하면 쓰다 만 파일이 될 가능성이 매우 높습니다.
      그런데, 이 경우를 가정해도 다음 반복실행에서 openw, 1 을 실행하면 “이미 열려 있는 파일입니다” 라는 에러가 발생합니다. 혹시 close 대신, /GET_LUN, FREE_LUN을 쓰셨다면 이부분을 살펴보셔야 할 것 같습니다만 올려주신 코드에서는 close를 쓰셨기 때문에 이 문제라고 보기는 좀 어렵죠.
      그럼에도, “중간에 작성이 멈춘 것 같다” 라는 말씀은 close, 1을 실행하지 못할 때의 전형적인 상황이어서 일단 이 부분 아닐까 찍어 봅니다.

      조금 더 정보가 필요한 상황입니다.

    • #3189 Reply
      JS
      회원

      빠르고 친절하신 답변 정말 감사드립니다.

      1) 말씀하신 내용이 정확합니다.

      2) 진단해주신 내용처럼, ‘이미 열려있는 파일입니다’ 라는 에러 메시지 없이 정상적으로 코드는 돌아갑니다. 저도 처음에 openw 로 열린 파일에 대한 close 가 되지 않는 것에 의심해보았으나 별다른 에러 메시지가 발생하지 않는다는 점에서 의심을 멈추었습니다. 위에 코드 일부를 말씀드렸듯이 get_lun 및 free_lun 이 아닌 숫자로 직접 지정하여 close 명령으로 파일을 닫아주고 있습니다.

      우분투 서버에 설치된 IDL에 ssh로 접속하여 작업하고 있는데, 하루단위의 작업에 대한 1년치 코드를 실행 시 약 3일 정도가 소요됩니다. 데스크탑에서 작업하기에 ssh 접속을 중간에 끊어주지 않고 오랜 기간에 걸쳐 (일주일 이상) 지속적으로 작업해왔습니다. 그렇지 않을 것이라는 생각이긴 하지만… 혹시 장기간 지속적인 접속으로 인해 IDL 실행 및 파일 생성에 영향을 줄 수도 있지 않을까하여 접속을 종료하고 새로 연결하여 테스트 중입니다.

      항상 좋은 팁과 의견을 주셔서 감사드립니다.
      테스트해보고 결과 공유하겠습니다.^^

    • #3190 Reply
      mwkim
      회원

      랜덤하게 발생하는 문제라니 원인 밝히는 과정이 쉽지 않아 보입니다.

      보실지 모르겠는데 추가적으로 두가지 정도 확인하면 좋을 것 같습니다.

      1. IDL 버전 확인(작업 환경도 같이)

      2. ASCII 형식이 아닌 다른 형식으로 자료 저장 후 자료 확인
      (기본적으로 IDL 에서 제공하는 저장 형식이 가장 무난할 것 같습니다.)

      1번은 버전에 따른 문제일 수도 있어서 질문드리는 것이고

      2번은 자료 자체에는 문제가 있는 것인지 아니면 저장할 때 문제가 있는 것인지 확인이 필요할 것 같습니다.

      추가로 위에 작성된 내용을 보면 IDL을 계속 터미널로 보면서 작업하시는 것 같은데
      중간에 수동처리할 부분이 없다면 백그라운드로 실행시키셔도 되지 않을까 합니다.
      (물론 중요 정보는 로그파일로 저장하도록 하고)

      SSH를 오래 열어두어서 결과에 영향이 미칠것이라고는 생각되지 않지만…
      랜덤 발생 에러니 가능성은 다 열어두는 것이 좋을 것 같습니다.

      테스트 결과 기다리고 있겠습니다.

      • #3199 Reply
        JS
        회원

        mwkim 님의 답변 감사드립니다.

        1. 현재 사용하는 IDL은 8.4 버전이며, 사용환경은 Ubuntu 16.04.2 입니다.

        2. .sav 파일 형태 등 다른 저장형식에 대한 테스트도 추가 진행해보도록 하겠습니다. 일단, 읽어들이는 자료 자체에는 전혀 문제가 없는 것으로 생각됩니다. vi 편집기를 이용한 파일 확인 및 IDL을 이용한 파일 읽기 등에 문제가 없습니다.

        우선, 위에 언급드린바와 같이 오래 열어두었던 SSH를 종료한 후 다시 작업한 이번 경우에는 1년치 데이터에 대한 각각의 1일 단위 파일에서 모두 문제가 발생하지 않았습니다. 다만, 이전에도 이렇게 잘 생성되었다가 다음에는 일부 무작위 파일에서 문제가 발견된 것을 보면 해결된 것으로 단정짓기엔 이른 것 같습니다.

        친절한 답변으로 관심주신 분들 모두 감사드리며, 다양한 경우에 대한 모든 가능성을 열어두고 여러 방법으로 테스트하며 작업하겠습니다.

3 답변 글타래를 보이고 있습니다
'openw로 생성한 ascii file의 input/output error'에 답변달기
글쓴이 정보: