IDL_SAVEFILE 클래스. (SAVE의 /ALL 키워드 사용 주의!)

다음 내용은 알고 있어야 합니다.

  • SAVE는 IDL의 메모리를 그대로 떠서 HDD에 저장하는 방식입니다.
  • 그래서, SAVE는 컴파일되어 메모리에 적재된 IDL 프로그램을 저장할 수도 있고, IDL에서 사용중인 변수를 저장할 수도 있습니다. 파일 하나에 이 두가지를 동시에 저장하는 것은 안됩니다.
  • RESTORE는 SAVE로 저장된 내용을 메모리에 다시 복원하는 명령어입니다.

SAVE와 RESTORE는 매우 편리한 도구입니다. IDL을 사용한다는 전제로, 이것은 아마도 가장 편리한 데이터의 저장, 복원 수단입니다. 물론, IDL의 컴파일된 루틴들을 저장하는 방법으로는 유일한 도구이기도 합니다. 이 글은, 데이터(변수)를 저장하고 복원하는 중에 발생할 수 있는 문제와 해결책을 제시합니다.

IDL에서 뭔가 작업하던 내용이 있습니다. 퇴근 전에 이를 저장하고, 다음날 출근하여 다시 작업을 이어서 수행하고자 하는 상황이 있겠습니다. 다음과 같이 저장합니다.

위와 같은 방식은 사실상 디폴트로, /VARIABLES 키워드가 작동합니다. 즉, 아래 두 명령문은 동일하게 작동합니다.

원하는 변수들만 저장해 둘 수도 있습니다. X, Y, Z 변수만 저장하고자 한다면 다음과 같이 합니다.

실제로 IDL 커뮤니티에서는 이렇게 저장해서 동료들에게 자료를 배포하는 경우가 많습니다. IDL의 예제 데이터에도 이렇게 저장된 파일들이 있습니다.

다음 날 아침에 출근해서 어제 저장한 데이터들을 복원하고자 합니다. 또는, 동료로부터 전달받은 데이터를 풀고자 합니다. 정말 간단합니다.

실제로 우리가 가지고 있는 save 파일을 하나 풀어 보도록 하지요.

examples/data/globalwinds.dat

examples/data/globalwinds.dat

데이터 SAVE의 확장자가 꼭 .sav 여야 할 필요는 없습니다. IDL 커뮤니티에서는 .dat 확장자도 많이 쓰입니다. 데이터가 어떤 규칙으로 저장되었는지, 굳이 알 필요는 없습니다. SAVE로 저장했다면 그냥 RESTORE로 풀면 됩니다. 단점이 하나 있긴 합니다. IDL을 쓰지 않으면 이 파일을 읽을 방법이 없습니다. 이제, 이 글을 쓰게 된 이유로 들어가 보겠습니다.

SAVE로 데이터를 저장할 때, FILENAME 키워드만 사용하면, /VARIABLES 키워드가 디폴트로 적용된다고 했습니다. 즉, 현재 존재하는 일반 변수 모두를 저장하라는 의미입니다. 가장 많이 쓰는 옵션입니다. 그런데, /ALL 이라는 키워드도 있습니다. 일단 ALL이라는 단어가 주는 시원함 때문에 사실상 널리 사용됩니다. “생각할 필요 없이 다 때려 넣어”라는 느낌이 있지요. 도움말을 보면, 아마도 우리가 원하는 저장항목인 로컬변수 외에도 시스템변수, COMMON BLOCK 변수까지 다 저장을 하는 옵션입니다. 혼자 사용할 때에는 아마도 /ALL 키워드의 문제가 드러나지 않을 가능성이 높습니다. 그래서 언제나 습관적으로 /ALL 키워드를 쓰는 분들이 있습니다. 이게 어떻게 문제가 되는지 짚어 보겠습니다.

  • A는 동료 B에게 자료를 전달할 목적으로 SAVE, /ALL 옵션을 사용하여 파일을 생성하였습니다. A는 작업환경이 리눅스입니다.
  • B는 A로부터 자료를 전달받아 RESTORE로 내용을 복원합니다. 데이터는 당연히 잘 풀립니다. 그런데, A의 시스템 변수까지 모두 복원되어 B의 시스템 변수를 덮어씁니다. 설상가상으로 B의 작업환경은 윈도우즈입니다.
  • B는 이제 정상적인 경로(!PATH 시스템 변수)도 잡히지 않아, 대부분의 명령어들이 작동하지 않습니다. 폰트를 가리키는 경로도 꼬여서 Direct Graphics도 작동하지 않습니다.

물론 IDL 안에서 발생하는 재앙은 그 여파가 크지 않습니다. 언제나 다음 명령으로 초기화가 가능하지요. 시스템에 타격을 주지도 않았으니까요.

이런 이유로, SAVE, /ALL 옵션은 특별한 목적이 아니면 사용하지 않는 것이 좋습니다. 키워드 없이 사용(즉, /VARIABLES 키워드 사용과 같음)하거나, 원하는 변수들만 저장하는 것이 가장 좋겠습니다. A는 이제 반성하고 다음부터는 조심하겠지요. 그러나 당장 급한 B는 어떻게 합니까? 방법은 있습니다.

IDL의 .SAV 파일을 구체적으로 다루는 IDL_SAVEFILE 이라는 클래스가 있습니다. 다음과 같이 시작합니다.

이제 저 oSV 변수가 해당 SAVE 파일을 쥐고 있습니다. 저 파일 안에 어떤 게 들어 있습니까?

변수 4개가 들어 있고(N_VAR), 문제의 시스템 변수는 안들어 있네요(N_SYSVAR).

어떤 변수들이 있습니까? (변수 이름).

U, V, X, Y 네 개의 변수가 들어 있네요. 모두 필요하지는 않고, U, V 만 필요한 상황이라면 다음과 같이 U, V만 복원할 수 있습니다.

RESTORE 메쏘드의 인자는, 복원하고자 하는 변수들의 이름을 문자열로 하는 배열(위와 같이 사용)이거나, 단일 문자열(하나의 변수만 복원할 경우)을 지정할 수 있습니다. X 변수만 읽고 싶다면 다음과 같이 합니다.

IDL_SAVEFILE 클래스의 NAMES() 메쏘드는 사실 일반 변수 뿐 아니라, 시스템 변수의 목록을 받아올 수도 있으며, 컴파일된 프로시저, 함수의 이름도 받아올 수 있습니다. /SYSTEM_VARIABLE, /PROCEDURE, /FUNCTION 등의 키워드를 조합하여 그런 일들을 할 수 있게 됩니다. 디폴트는 일반변수의 목록만 가지고 오는 것이죠. 위의 oSV.NAMES() 에서의 용례처럼 말입니다. 그래서, 여러분이 혹시 시스템 변수까지 포함된 SAVE 파일을 받았는데, 일반변수만 복원하고 싶은 경우(시스템 변수는 배제하고 싶은 경우)라면, 그냥 RESTORE를 쓸 게 아니라 다음과 같이 하면 됩니다.

 

어떤 질문을 받고 이 글을 쓰게 되었습니다. 다음과 같은 질문이었습니다.

“IDL을 처음 시동하면 New Graphics 가 잘 됩니다. 그런데 사용을 하다 보면 어느 순간 갑자기 New Graphics 뿐 아니라 IDL의 모든 기능이 잘 작동하지 않습니다.”

처음에는 대수롭지 않게 생각을 했고, 몇가지 처방을 했으나, 상황은 호전되지 않았습니다. 결국, IDL을 띄워서 어떤 일을 했는지 따져 보았고, 어떤 프로그램을 돌린 이후에 이런 문제가 발생하며, 그 프로그램 안에는 RESTORE 명령이 있었고, RESTORE로 복원하는 SAVE 파일을 제가 조사해 보고 나서 문제가 파악되었습니다. 흔히 겪지 않아 본 문제였습니다. 혹시 여러분도 비슷한 증세를 겪으신다면, SAVE & RESTORE로 부터 발생하는 문제가 아닌지 검토해 보세요.