[myLV.net 집필진 강좌 – Goodmaner]
이번 강좌에서는 LabVIEW 프로그래밍 시 메모리를 최적화하기 위하여 어떤 부분들을 고려해야 하는지에 대해서 살펴보겠습니다. 요즘은 PC 사양이 좋아서 왠만큼 큰 규모의 프로그램을 구현하지 않는 이상 메모리 부족으로 인한 문제는 발생하지 않습니다.
제 주변에서도 LabVIEW를 이용하여 프로그램을 개발하시는 분들을 보면, 기능 구현 위주로 작업해서 코드 상에 불필요한 메모리를 사용하는 경우가 많습니다.
지금부터 어렵지 않지만 알아두면 메모리를 최소화시킬 수 있는 방법들에 대해서 살펴보겠습니다.
우선, 메모리가 코드 상 어느 부분에서 할당되는지를 확인하는 방법은 Tools>>Profile>>Show Buffer Allocations...을 클릭하면 아래와 같은 다이얼로그 창이 활성화되고, "Refresh" 버튼을 클릭하면 메모리 버퍼가 할당된 위치를 표시해 줍니다.
검은 점으로 표시된 부분이 메모리 버퍼가 할당된 위치이며, 메모리 최적화 적용 전/후 메모리 버퍼 할당 위치가 어떻게 바뀌었는지 확인할 때 유용합니다.
메모리를 사용하는 위치로 Front Panel과 Block Diagram 영역으로 크게 구분할 수 있는데, Front Panel의 경우에는 Control과 Indicator 그리고 default data들에 의해서 메모리를 사용하게 됩니다. 대부분의 메모리 최적화 작업은 Block Diagram에서 진행될 수 있으며 메모리 최적화를 위해서 버퍼가 재 할당되는 원인들을 알아야 합니다.
Block Diagram에서 버퍼를 재할당하는 경우들은 아래와 같습니다.
1.강제변환점
2.로컬변수와 글로벌 변수
3.사용자 인터페이스 프로퍼티 노드
4.조건적 Indicator
강제변환점은 아래와 같이 서로 다른 입력 데이터 타입에 대해서 연산처리를 하려는 경우 LabVIEW 자체에서 강제로 형변환을 수행하는 경우로 불필요한 메모리를 할당하게 됩니다. 빨강색으로 표시된 부분이 강제변환점에 해당됩니다.
로컬 변수와 글로벌 변수의 경우에도 관련 변수가 추가될 때마다 동일한 메모리가 반복해서 생성되게 됩니다. 아래의 예에서와 같이 하나의 Control 값을 여러 개의 Indicator로 보내줄 때 로컬 변수를 사용할 때보다 직접 연결하는 경우 메모리를 더 적게 사용하게 됩니다.


사용자 인터페이스 프로퍼티 노드의 경우 로컬 변수처럼 메모리를 추가하지는 않지만 터미널에 직접 와이어링해서 데이터를 쓰거나 읽는 것보다는 추가적인 버퍼를 할당하기 때문에 가급적이면 지양하는 게 좋습니다.
조건적 Indicator의 경우에도 데이터 버퍼를 재 사용하지 못하기 때문에 지양하는 것이 좋습니다. 아래와 같은 경우가 조건적 Indicator를 사용하는 경우의 한 예입니다.
메모리를 최적화하기 위하여 "In Place Element Structure"를 사용할 수 있습니다. 아래는 "In Place Element Structure"를 사용하지 않은 경우와 사용한 경우의 예입니다.

"In Place Element Structure"에서 사용할 수 있는 Node들은 아래와 같습니다.

다음은 "Data Value Reference"를 사용하여 메모리 위치의 포인터를 참조하도록 하는 방법이 있습니다. 이 기능은 LabVIEW2009 이후부터 지원하는 것으로 함수 팔레트에서 Programming>>Application Control>>Memory Control에 API들이 제공됩니다. 아래와 같이 "In Place Element Structure"와 함께 사용되어질 수 있습니다.

"Build Array"는 for loop 안에서 사용하는 것을 지양해야 메모리 재할당을 줄일 수 있습니다. 아래에서 보는 바와 같이 왼쪽에서처럼 for loop 안에서 "Build Array"를 사용하여 1차원 배열을 생성하는 것보다 오른쪽에서처럼 생성하는 게 메모리 재 할당을 최소화시킬 수 있습니다.

사용하려는 메모리의 크기를 "Initialize Array"로 사전에 할당한 후 배열 값을 변경하는 방식으로 운영함으로써 메모리를 줄일 수 있습니다. 아래에서와 같이 초기에 원소 값이 0인 배열크기가 10000인 배열을 초기화해서 특정 조건을 만족하는 경우에 배열 값을 대체하도록 운영할 수 있습니다.

"Request Deallocation" API를 이용하여 사용하지 않는 메모리를 할당 해제할 수 있습니다. 함수 팔레트의 Programming>>Application Control>>Memory Control에 있습니다.

마지막으로 Main VI에 대한 모듈화를 통하여(Sub VI 호출하는 방식) 운영하면 Sub VI에서 사용하는 메모리가 최초 Main VI가 호출될때 할당되지 않고, 실제 Sub VI가 수행될 때 메모리가 할당되고, Sub VI 수행이 끝나면 메모리가 해제됩니다. 따라서 기능 별로 코드 모듈화를 하게 되면 메모리 운영 측면에서 유리할 수 있습니다. 하지만 이로 인하여 수행 속도가 느려질 수 있기 때문에 메모리와 속도 최적화를 적절히 고려하여 구현하면 좋을 것 같습니다.
다음 강좌에서는 속도를 최적화하는 방법에 대해서 살펴보도록 하겠습니다.