IDL 최대 배열 수

게시판 ENVI Q&A IDL 최대 배열 수

1 답변 글타래를 보이고 있습니다
  • 글쓴이
    • #2382 Reply
      JOON
      회원

      IDL에서 최대 얼마까지 배열을 잡을 수 있는지요?
      (10000,10000) 요런 식으로 얼마까지 가능할까요?

    • #2384 Reply
      Jonghyuk
      회원

      이 문제는 딱히 답이 있지는 않습니다. 사용하시는 시스템에서 메모리를 할당해 보고 프로그램이 잘 돌아가는지 보시는 게 답이라고 생각합니다.

      1. 요즘의 64bit 운영체제에서는 사실상 메모리(RAM)이 많다면 꽤나 큰 배열 할당이 가능합니다. 그런데, 메모리의 크기가 RAM이 감당할 수 있는 크기를 넘어가면 Virtual Memory를 사용하게 되며(HDD의 일부를 RAM 처럼), 속도가 괴로울 정도로 느려집니다. 이건 원하시는 바가 아니라고 생각합니다. 참고로 예전의 32Bit 운영체제라면 2GB 이상의 메모리를 할당하는 것이 불가능했습니다. 아래 다른 이유로 물론 2GB 정도의 메모리를 다 쓰는 배열을 잡기는 불가능했습니다.

      2. 배열의 크기는 데이터 타입마다 다른데요, 1byte짜리 byte 형의 10000*10000 즉 bytarr(10000, 10000)이라면, 10000*10000*1 byte의 메모리가 필요합니다. 대략 100MB 정도 되는 크기네요. 이게 Double 형이라면 즉, dblarr(10000, 10000) 이면 10000*10000*8byte가 되므로 800MB 정도가 되는 크기입니다. 그러므로 배열의 요소 개수만 가지고 배열의 크기를 따지는 것은 의미가 없어 보입니다.

      3. 배열은 운영체제 안에서, 끊이지 않고 쭉 연결된 메모리 영역을 필요로 합니다. 즉, 아무리 많은 메모리가 있다고 해도, 처음부분에는 운영체제가 차지하고 있고, 중간부분은 어플리케이션들이 차지하고 있고, 마지막 부분은 하드웨어 디바이스 드라이버들이 차지하고 있다면(이보다 더 복잡하겠지만 쉽게 예를 들자면), 처음부터 끝까지 한통으로 쭉 이어진 메모리를 할당할 수가 없게 되고, 결국 우리가 예상하는 것 보다는 작은 크기의 배열만 사용할 수 있게 됩니다. 요즘은 운영체제가 개선되어서 이 부분이 많이 해소되었다고 들었습니다. 즉, 끊어져 존재하는 메모리도 한통으로 묶어 할당할 수 있게 하는 기술인데요, 윈도 계열보다 유닉스/리눅스 계열이 이 부분이 뛰어나다고 합니다. 이런 이유로 IDL 실행 당시의 운영체제 상황이 매번 다르기 때문에, 얼마 크기의 배열을 한통으로 잡을 수 있는지가 정답이 없습니다.

      4. 배열을 하나 선언하면 그것으로 원하는 바를 이루는 것은 아닙니다. 이를 이용한 계산도 해야 하고, 이를 다시 다른 변수에 저장도 해야 하고, 배열들 간의 계산도 해야 합니다. 그러므로 어떤 대단한 크기의 배열을 할당했다고 해서 OK가 아닙니다. 상황에 따라 이 배열의 몇 배 되는 공간이 필요할 것입니다. 대부분의 상황이 그렇습니다.

      저는 리소스가 넉넉한 리눅스 운영체제에서 Floating 형으로 40000*40000 정도의 배열은 할당해서 사용할 때가 있습니다. 그렇지만 납품용 프로그램을 개발할 때는 이렇게 하지는 않습니다. 이정도의 메모리를 할당할 수 있는 시스템을 보장할 수가 없거든요.

      참고로, 매우 큰 영상도 잘 처리하는 ENVI 소프트웨어(IDL로 만들었습니다)는 평범한 4GB RAM 을 가진 시스템에서도 잘 돌아갑니다. 영상을 타일로 쪼개서 처리하도록 개발했기 때문입니다. 물론 “나는 메모리 충분하다”라고 생각하시면 이 타일 크기를 늘릴 수는 있습니다.

      이런 이유로, 얼마나 큰 배열을 잡을 수 있나요 에 대한 답은… 사용하시는 시스템에서 필요한 일을 시도해 보시는 것이 답이라고 생각합니다.

      기술적 요약
      1. 시스템의 물리적 메모리 한계가 존재합니다. HDD를 이용한 Virtual Memory라는 게 존재하지만 이를 가능하면 안쓰는 것이 정신 건강에 좋습니다.
      2. 운영체제가 가지는 메모리 한계가 존재합니다. 특히 32bit 운영체제는 하드웨어적 RAM이 얼마가 되든지 2GB 정도의 메모리만 할당이 가능합니다.
      3. 조각난 메모리의 효용성 한계가 존재합니다. 여러개의 작은 배열을 잡는데는 문제가 없지만, 큰 배열 하나를 잡는데는 한계가 있습니다.
      4. Data Type에 따라 같은 element 수의 배열이라도 메모리상 차지하는 공간의 크기는 많이 차이납니다.
      5. 배열 선언이 프로그램의 목적이 아니므로, 계산 과정에서 배열 크기의 여러 배에 해당하는 메모리가 필요해집니다.

1 답변 글타래를 보이고 있습니다
'IDL 최대 배열 수'에 답변달기
글쓴이 정보: