IDL 유저들이 간헐적으로 궁금해하는 문제들 중 하나가 있습니다. , 즉 배열 하나에 담을 수 있는 원소들의 갯수는 최대 얼마까지 가능하냐의 문제입니다. 사실 이 문제는 좀 포괄적인 성격이 강하기 때문에 뭔가 딱부러진 답을 제시하기는 쉽지 않습니다. 다만, IDL을 사용하는 시스템에서 메모리를 할당해 보고 프로그램이 잘 돌아가는지 보는 것이 정답에 가깝다고 생각합니다. 구체적으로 몇가지 항목들로 나눠서 얘기해본다면 다음과 같습니다.
1. 요즘의 64bit 운영체제에서는 사실상 메모리(RAM)가 많다면 꽤나 큰 배열의 할당이 가능합니다. 그런데, 메모리의 크기가 RAM이 감당할 수 있는 크기를 넘어가면 Virtual Memory를 사용하게 되며(HDD의 일부를 RAM 처럼), 속도가 괴로울 정도로 느려집니다. 이건 유저들이 원하는 바는 아니라고 생각합니다. 참고로 예전의 32Bit 운영체제라면 2GB 이상의 메모리를 할당하는 것이 불가능했습니다. 물론 아래에 3에서 설명된 또 다른 이유로 인하여 2GB 정도의 메모리를 한꺼번에 다 점유하는 배열을 사용하는 것도 실질적으로는 거의 불가능했습니다.
2. 배열이 점유하는 메모리의 크기는 데이터의 형(Type)마다 다릅니다. Byte 형의 값들로 구성된 10000*10000 크기의 배열, 즉 BYTARR(10000, 10000)로 정의된 배열이라면, 10000*10000*1(byte)의 메모리가 필요합니다. 대략 100MB 정도 되는 크기가 됩니다. 그런데 똑같은 크기로 Double 형 값들로 구성된 경우 즉, DBLARR(10000, 10000) 이면 10000*10000*8(byte)가 되므로 800MB 정도나 되는 크기의 메모리를 점유하게 됩니다. 그러므로 배열의 요소 개수만 가지고 배열의 크기를 따지는 것은 의미가 없습니다.
3. 배열은 운영체제 안에서, 끊이지 않고 쭉 연결된 메모리 영역을 필요로 합니다. 즉, 아무리 많은 메모리가 있다고 해도, 처음 부분은운영체제가 차지하고 있고, 중간 부분은 어플리케이션들이 차지하고 있고, 마지막 부분은 하드웨어 디바이스 드라이버들이 차지하고 있다면(이보다 더 복잡하겠지만 쉽게 예를 들자면), 처음부터 끝까지 한통으로 쭉 이어진 메모리를 할당할 수가 없게 됩니다. 결국 우리가 예상하는 것 보다는 작은 크기의 배열만 사용이 가능하다고 보면 됩니다. 물론 요즘은 운영체제들이 많이 개선되어서 이 부분이 많이 해소되었다고 들었습니다. 즉, 끊어져 존재하는 메모리도 한통으로 묶어 할당할 수 있게 하는 기술인데요. 윈도우즈 계열보다 유닉스/리눅스 계열의 OS들이 이런 부분에 있어서 더 뛰어나다고 합니다. 그러나 이러한 이유로 인하여, IDL 실행 당시의 상황이라는 것이 운영체제에 따라서도 매번 다르기 때문에, 실제 상황에서 어느 정도 크기의 배열을 한 통으로 잡을 수 있는가에 대한 단일한 정답이 없습니다.
4. 실제 작업에서는 사실 배열을 하나 선언하기만 한다고 해서 그것으로 원하는 바를 모두 이루는 것은 아닙니다. 이 배열을 이용한 계산도 해야 하고, 그 결과를 다시 다른 배열에 저장도 해야 하고, 배열들 간의 계산도 해야 합니다. 그러므로 어떤 대단한 크기의 배열을 하나 할당했다고 해서 만사가 끝난 것이 아닙니다. 상황에 따라 이 배열의 몇 배 정도나 되는 메모리 공간이 더 필요할 것입니다. 대부분의 상황이 그렇습니다.
저는 리소스가 넉넉한 리눅스 운영체제에서 Floating 형으로 40000*40000 정도의 배열을 할당해서 사용할 때가 아주 가끔은 있습니다. 그렇지만 납품용으로 프로그램을 개발할 때는 이렇게 하지는 않습니다. 그 컴퓨터의 운영체제나 시스템이 이 정도의 메모리를 감당할 수 있을 것이라는 보장을 섣불리 할 수가 없기 때문입니다. 더구나 그 컴퓨터가 오직 이 작업만을 하고 있을 것이라는 보장도 하기가 어려운 것이 현실입니다. 참고로, 매우 큰 영상도 잘 처리하는 ENVI라고 하는 위성영상 처리용 소프트웨어(IDL로 만들어져 있습니다)는 평범한 4GB RAM 을 가진 컴퓨터 시스템에서도 잘 돌아갑니다. 내부적으로 영상을 타일 형태로 쪼개서 처리하도록 개발되어 있기 때문입니다. 물론 “내 컴퓨터는 메모리가 아주 충분하다”라고 생각되는 경우에는 이러한 타일의 크기를 더 늘릴 수는 있습니다. 어쨌든 이러한 이유들로 인하여, 단순히 "얼마나 큰 배열을 잡을 수 있나요"라는 질문에 대한 답은… 실제 사용하는 컴퓨터 시스템에서 필요한 일을 직접 시도해 보는 것이 답이라고 생각합니다. 즉, 되는데까지가 한계다라고 보면 그게 정답이 될 것 같습니다.
<기술적 요약>
1. 시스템의 물리적 메모리 한계가 존재합니다. HDD를 이용한 Virtual Memory라는 게 존재하지만 이것은 가능하면 쓰지 않는 것이 정신 건강에 좋습니다.
2. 운영체제가 가지는 메모리 한계가 존재합니다. 특히 32bit 운영체제는 하드웨어적인 RAM이 얼마가 되든지에 상관없이 무조건 2GB 정도의 메모리만 할당이 가능합니다.
3. 조각난 메모리의 효용성 한계가 존재합니다. 여러개의 작은 배열들을 사용하는데 있어서는 별다른 문제가 없지만, 큰 배열 하나를 잡는데는 한계가 있습니다.
4. 서로 같은 원소(element) 갯수를 갖는 배열이라도 원소값의 자료형(Data Type)에 따라 메모리상으로 차지하는 공간의 크기는 상당히 차이가 날 수 있습니다.
5. 실제 상황에서는 배열 선언만이 프로그램의 목적인 것은 아니기 때문에, 계산 과정에서 배열 크기의 여러 배에 해당하는 메모리가 필요해집니다.
* 이 내용은 얼마전 IDL/ENVI 유저 게시판에 올라온 질문/답변의 내용을 토대로 작성된 것입니다.
'IDL > Miscellaneous' 카테고리의 다른 글
PATH_SEP 함수 소개 (0) | 2016.01.11 |
---|---|
크리스마스 및 새해 인사 (powered by IDL) (0) | 2015.12.24 |
명령줄 도움말의 이용 (0) | 2015.01.26 |
2014년이 갑니다 (0) | 2014.12.23 |
데스크탑 화면 크기 정보를 IDL에서 확인하는 방법 (0) | 2014.09.04 |