IDL 8.8.1에서 .sav 파일의 호환성에 관하여
최근(2021년 9월)에 출시된 IDL의 최신 버전인 8.8.1에 관한 대략적인 내용은 제가 관련 게시물을 통하여 한번 소개한 바 있습니다. 그런데 지난 8월말에 본사에서 주최했던 IDL/ENVI의 최신 버전 소개 웨비나에서는 언급이 되었지만, 그 외의 경로로는 많이 언급되지 않았던 이슈가 하나 있어서 제가 여길 통해서 소개해드릴까 합니다. 바로 Save 파일의 호환성에 관한 이슈인데요. Save 파일이란 것은 IDL에서만 사용되는 .sav 확장자의 파일로서 각종 변수나 배열들을 한꺼번에 저장하는 파일 형식입니다. 이와 관련된 자세한 내용은 제가 예전에 올렸던 관련 게시물의 내용을 참조하시면 됩니다.
그런데 이번 IDL 8.8.1에서 Save 파일의 호환성에 관한 이슈는 바로 저장될 데이터 중에 List, Hash, OrderedHash, Dictionary 자료형의 데이터가 포함되었을 경우에 관한 것입니다. 즉 예를 들면 다음과 같은 경우입니다.
a = 34.8
b = FINDGEN(101)
c = LIST(8.5, FINDGEN(11)*2, ['aa', 'bb', 'cc'])
SAVE, FILENAME='test.sav', a, b, c
이와 같이 변수 a, 배열 b, 리스트 c라는 세가지 항목들을 test.sav라는 Save 파일로 저장하고, 나중에 이 파일에 대하여 RESTORE 명령을 사용하여 a, b, c를 복원하는 경우를 예로 들었습니다. 다만 SAVE를 어디서 했고 RESTORE를 어디서 할 것이냐의 문제인데요. 바로 다음과 같은 경우입니다.
IDL 8.8.0 또는 그 이전의 버전에서 위와 같이 저장된 .sav 파일이 있고 이 파일을 IDL 8.8.1에서 복원하는 경우
데이터의 복원을 위해서는 다음과 같이 RESTORE 명령을 사용하게 될텐데 이러한 시도를 IDL 8.8.1에서 하는 경우입니다.
RESTORE, 'test.sav'
그런데 실제로 IDL 8.8.1에서 위와 같이 하면 다음과 같은 경고 메시지가 뜨게 됩니다.
% Wrong number of tags defined for structure: LIST.
% RESTORE: Structure not restored due to conflict with existing definition: LIST.
사실 이것은 에러(Error) 메시지는 아니고 경고(Warning) 메시지입니다. 실제 결과를 보면 a, b는 정상적으로 복원이 되었지만 리스트 데이터인 c는 제대로 복원이 안됩니다. 엄밀히 말하면 c라는 항목 자체는 "복원"은 되지만 실제로는 리스트 데이터가 아닌 그냥 null 상태로 존재할 뿐입니다. 즉 제대로 복원이 안된 것이죠. 물론 해결책은 있습니다. 즉 a, b 뿐 아니라 리스트 데이터인 c까지도 정상적으로 복원되도록 하기 위해서는 다음과 같이 RELAXED_STRUCTURE_ASSIGNMENT 키워드를 함께 사용해야 합니다.
RESTORE, 'test.sav', /RELAXED_STRUCTURE_ASSIGNMENT
키워드의 이름이 좀 깁니다만 이걸 반드시 사용해야 합니다. 그러면 a, b, c 모든 데이터들이 정상적으로 복원이 됩니다. 이런 이슈가 생길 수 밖에 없는 이유는 제가 IDL 8.8.1에 관하여 다른 게시물에서 소개했던 내용중에서 바로 다음과 같은 사항과 직접 연관이 있습니다.
1. 현세대 자료 구조들의 퍼포먼스 향상
IDL에서 지원되는 자료형들 중 비교적 최근에 도입된 List, Hash, OrderedHash, Dictionary 등과 같은 현세대 자료형들의 사용에 있어서 속도 및 효율성 등에 대한 전반적인 향상이 있을 예정입니다. 즉 이러한 자료형의 데이터를 생성하고 활용하는데 있어서 그 속도가 이전에 비하여 평균적으로 거의 70~80% 정도의 빨라진다고 합니다. 원래는 이러한 기능들이 IDL의 소스코드인 .pro 파일로 작성되어 탑재되어 왔는데, 이제 8.8.1 버전에서부터는 IDL의 내부 코어에 심어지게 된다(embedded)고 합니다. 그리고 이러한 변화에 힘입어 JSON 형식의 자료의 취급에 있어서도 전반적인 효율 향상이 있게 된다고 합니다. 아무래도 요즘의 프로그래밍에서는 이러한 복합형 자료형(Compound Data Type)에 대한 수요가 점점 높아지고 있기 때문에, 이러한 변화는 바람직한 방향이라고 봅니다.
즉 IDL의 List, Hash, OrderedHash, Dictionary 자료형에 관한 기능들이 이번 8.8.1 버전부터는 모두 IDL의 코어에 심어지게 되었기 때문이다 정도로 생각하시면 되겠습니다. 물론 이 얘기는 Save로 저장될 데이터 중에 List, Hash, OrderedHash, Dictionary 자료형에 해당되는 항목들이 있을 경우에 한정됩니다. 이러한 자료형의 데이터가 전혀 없고 그냥 일반적인 변수, 배열, 구조체 등과 같은 것들만 있는 경우에는 아무런 제한사항이 없습니다.
그래서 만약에 8.8.0 또는 그 이전 버전의 IDL에서 만들어진 .sav 파일이 있는데 이 안에 List, Hash, OrderedHash, Dictionary 자료형에 해당되는 항목들이 전혀 포함되지 않았다면 IDL 8.8.1에서도 그냥 바로 사용하시면 됩니다. 하지만 만약 List, Hash, OrderedHash, Dictionary 자료형에 해당되는 항목들이 포함된 상태로 예전 버전의 IDL에서 저장된 .sav 파일을 IDL 8.8.1에서도 계속 사용해야 할 경우라면 바로 위에서 제시한 방법(RELAXED_STRUCTURE_ASSIGNMENT 키워드를 사용하는)을 사용하시면 됩니다.
그리고 그 반대의 경우도 같은 요령으로 해결됩니다. 무슨 얘기냐 하면 바로 다음과 같은 경우입니다.
IDL 8.8.1 버전에서 위와 같이 저장된 .sav 파일이 있고 이 파일을 IDL 8.8.0 또는 그 이전 버전의 IDL에서 복원하는 경우
즉 List, Hash, OrderedHash, Dictionary 자료형에 해당되는 항목들이 포함된 상태로 IDL 8.8.1에서 저장된 .sav 파일을 그 이전 버전의 IDL에서 사용해야 할 경우에도 역시 바로 위에서 제시한 방법(이름이 엄청 긴 키워드를 포함하는)을 사용하시면 됩니다.
RESTORE, 'test.sav', /RELAXED_STRUCTURE_ASSIGNMENT
어차피 RESTORE 명령의 RELAXED_STRUCTURE_ASSIGNMENT 키워드는 거의 모든 버전의 IDL에서 지원되기 때문에 .sav 파일의 호환성에 관한 이슈는 이러한 방법으로 해결하시면 됩니다.