Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

"메모리 부족" 오류 해결하기

여기에서는 MATLAB®에 메모리가 부족한 상황에서 사용할 수 있는 몇 가지 전략을 설명합니다. MATLAB은 64비트 운영 체제에서 실행되는 64비트 응용 프로그램입니다. MATLAB은 사용 가능한 것보다 큰 메모리 세그먼트를 운영 체제에 요청할 때마다 오류를 반환합니다.

MATLAB에는 너무 큰 배열을 만드는 것을 방지하는 기능이 내장되어 있습니다. 기본적으로 MATLAB은 컴퓨터의 RAM(가상 메모리 미포함)을 최대 100%까지 사용하여 배열에 메모리를 할당할 수 있으며, 배열이 이 임계값을 초과하면 MATLAB은 오류를 반환합니다. 예를 들어, 다음 명령문은 지나치게 큰 크기의 배열을 만들려고 합니다.

A = rand(1e6,1e6);
Error using rand
Requested 1000000x1000000 (7450.6GB) array exceeds maximum array size preference. Creation of arrays greater than this limit may take a long time and cause
MATLAB to become unresponsive.

More information
이 배열 크기 제한을 조정하는 방법에 대한 자세한 내용은 작업 공간 기본 설정과 변수 기본 설정 항목을 참조하십시오. 배열 크기 제한을 비활성화하면 MATLAB은 다른 오류를 반환합니다.

A = rand(1e6,1e6);
Out of memory.

More information

메모리 제한 문제가 발생하더라도 목표에 따라 사용할 수 있는 몇 가지 해결책이 있습니다. 다음을 포함하여 효율적인 메모리 사용을 위한 전략에서 설명한 방법을 통해 사용 가능한 메모리를 최적화할 수 있습니다.

이미 메모리를 효율적으로 사용하고 있는데도 문제가 지속되면 이 페이지의 나머지 섹션에서 사용 가능한 해결책을 참조하십시오.

tall형 배열 활용하기

메모리에 담을 수 없는 큰 데이터를 위한 tall형 배열은 너무 커서 메모리에 다 담을 수 없는 데이터 세트를 사용할 수 있도록 하기 위해 설계되었습니다. MATLAB은 한 번에 데이터의 작은 블록 단위로 작업하며 모든 데이터 청크화 작업과 처리 작업을 백그라운드에서 자동으로 수행합니다. tall형 배열을 활용할 수 있는 다음 두 가지 기본적인 방법이 있습니다.

  1. 메모리에 들어가기는 하지만 계산을 수행하기에는 메모리가 부족한 큰 배열을 사용하는 경우 배열을 tall형 배열로 형변환하면 됩니다.

    B = tall(A)
    이 방법을 사용하면 메모리에 다 들어갈 수는 있지만 계산 시 메모리 사용량이 너무 많아서 데이터 복사본을 만들 수 없는 큰 배열을 사용할 수 있습니다. 예를 들어, RAM이 8GB이고 행렬이 5GB인 경우 행렬을 tall형 배열로 형변환하면 메모리 부족 현상 없이 행렬에서 계산을 수행할 수 있습니다. 이 사용 방법에 대한 예제를 보려면 Convert In-Memory Arrays to Tall Arrays 항목을 참조하십시오.

  2. 파일 기반 데이터 또는 폴더 기반 데이터의 경우, datastore를 만든 후 이 데이터저장소 위에 tall형 배열을 만들 수 있습니다.

    ds = datastore('path/to/data.csv');
    tt = tall(ds);
    이 방법을 사용하면 MATLAB에서 tall형 배열의 장점을 최대한 활용할 수 있습니다. 데이터는 행 개수의 구애를 받지 않을 수 있고 MATLAB에는 메모리 부족 문제가 발생하지 않습니다. datastore는 로컬 데이터 위치와 원격 데이터 위치를 모두 사용할 수 있기 때문에 작업하는 데이터가 데이터 분석을 위해 사용 중인 컴퓨터에 있지 않아도 됩니다. 자세한 내용은 원격 데이터로 작업하기 항목을 참조하십시오.

여러 컴퓨터의 메모리 활용하기

컴퓨터 클러스터가 있는 경우, Parallel Computing Toolbox™ 분산 배열 (Parallel Computing Toolbox)로 클러스터에 있는 모든 컴퓨터의 메모리를 결합하여 계산을 수행할 수 있습니다. 이 방법을 사용하면 전체 분산 배열을 하나로 취급하여 연산을 수행할 수 있습니다. 하지만 워커는 배열에서 자신에게 할당된 부분에 대해서만 연산을 수행하고 필요한 경우 워커 간에 자동으로 데이터를 전송합니다.

분산 배열을 만드는 방법은 tall형 배열을 만드는 방법과 유사합니다.

ds = datastore('path/to/data.csv');
dt = distributed(ds);

필요한 양의 데이터만 불러오기

메모리 문제를 해결할 수 있는 또 다른 방법은 대규모 데이터 세트 중에서 해결하려는 문제에 필요한 만큼만 MATLAB으로 가져오는 것입니다. 이는 일반적으로 데이터베이스 등의 소스에서 가져올 때는 쿼리와 일치하는 요소를 명시적으로 검색할 수 있으므로 문제가 되지 않습니다. 반면 대용량의 일반 텍스트나 이진 파일을 불러올 때 흔히 발생하는 문제입니다.

datastore 함수를 사용하면 대규모 데이터 세트를 단계적으로 사용할 수 있습니다. 이 함수는 메모리에 담을 수 없는 큰 데이터를 위한 tall형 배열분산 배열 (Parallel Computing Toolbox)을 보완하는 역할을 하지만 다른 용도로도 사용할 수 있습니다. 데이터저장소는 데이터 세트를 작은 부분으로 구분해 한 번에 메모리로 조금씩 불러오려고 할 때 유용합니다.

데이터저장소를 만들려면 파일 이름 또는 유사한 형식이 지정된 파일 모음이 포함된 디렉터리의 이름을 제공해야 합니다. 예를 들어, 하나의 파일을 사용하는 경우는 다음과 같습니다.

ds = datastore('path/to/file.csv')
폴더에 있는 파일 모음을 사용하는 경우는 다음과 같습니다.
ds = datastore('path/to/folder/')
또한 다음과 같이 와일드카드 문자 *를 사용하여 특정 유형의 모든 파일을 선택할 수도 있습니다.
ds = datastore('data/*.csv')
데이터저장소는 다양한 종류의 일반적인 파일 형식(테이블 형식, 이미지, 스프레드시트 등)을 지원합니다. 자세한 내용은 Select Datastore for File Format or Application 항목을 참조하십시오.

데이터저장소 외에도 MATLAB은 파일의 일부를 불러올 수 있는 몇몇 다른 함수를 제공합니다. 예를 들어, matfile 함수는 MAT 파일의 일부를 불러올 수 있습니다. 다음 표에는 부분 불러오기 함수가 파일 형식별로 요약되어 있습니다.

파일 형식부분 불러오기
MAT 파일

matfile 함수를 사용하여 생성한 객체의 요소를 참조하여 변수의 일부를 불러옵니다. 이 사용 방법에 대한 예제를 보려면 Big Data in MAT Files를 참조하십시오.

텍스트

textscan 함수를 사용하면 선택한 열과 행만 읽어 들여 대용량 텍스트 파일의 일부에 액세스할 수 있습니다. textscan을 사용하여 행 개수나 반복 형식 번호를 지정하는 경우, MATLAB은 정확히 필요한 메모리 양을 사전에 계산합니다.

이진 파일

fread와 같은 로우 레벨 이진 파일 I/O 함수를 사용하면 알려진 형식의 파일 일부에 액세스할 수 있습니다. 알 수 없는 형식의 이진 파일의 경우에는 memmapfile 함수를 사용하여 메모리 매핑을 시도해 보십시오.

이미지, HDF, 오디오, 비디오 파일

이러한 유형의 파일에서 불러올 수 있도록 지원하는 다수의 MATLAB 함수는 읽을 데이터의 일부를 선택할 수 있게 해 줍니다. 자세한 내용은 가져오기와 내보내기에 지원되는 파일 형식에 나열된 함수 도움말 페이지를 참조하십시오.

시스템 스왑 공간 늘리기

컴퓨터의 응용 프로그램에 사용할 수 있는 총 메모리는 물리적 메모리(RAM)와 디스크의 페이지 파일이나 스왑 파일로 구성됩니다. 스왑 파일은 매우 클 수 있습니다(예: 64비트 Windows®에서 512테라바이트). 운영 체제는 시스템이나 다른 프로세스의 요구에 따라 각 프로세스의 가상 메모리를 물리적 메모리나 스왑 파일에 할당합니다. 스왑 파일의 크기를 늘리면 사용 가능한 총 메모리가 증가할 수 있지만 성능 면에서 일반적으로 속도가 느려집니다.

대부분의 시스템에서는 스왑 파일의 크기를 제어할 수 있습니다. 이를 수행하는 단계는 사용하는 운영 체제에 따라 다릅니다.

  • Windows 시스템 — Windows 제어판을 사용하여 시스템의 가상 메모리 페이징 파일의 크기를 변경합니다. 자세한 내용은 Windows 도움말을 참조하십시오.

  • Linux® 시스템 — mkswap 명령과 swapon 명령을 사용하여 스왑 공간을 변경합니다. 자세한 내용을 보려면 Linux 프롬프트에서 man을 입력하고 그 뒤에 명령 이름을 입력하십시오.

macOS 시스템에서는 스왑 공간을 직접적으로 제어할 수 있는 인터페이스가 없습니다.

Linux 시스템에서 프로세스 제한 설정하기

프로세스 제한은 단일 프로세스(또는 응용 프로그램)가 처리할 수 있는 최대 가상 메모리 양입니다. 드물긴 하지만 이 기본 설정을 지정하는 경우, 프로세스 제한은 다음을 수용할 수 있을 정도로 커야 합니다.

  • 처리할 모든 데이터

  • MATLAB 프로그램 파일

  • MATLAB 실행 파일 자체

  • 추가 상태 정보

64비트 운영 체제는 8테라바이트의 프로세스 제한을 지원합니다. Linux 시스템에서는 ulimit 명령을 사용하여 가상 메모리 등의 사용자 제한을 확인하고 설정합니다.

Linux 시스템에서 Java VM 비활성화하기

Linux 시스템에서 Java® JVM™ 없이 MATLAB을 시작하면 사용 가능한 작업 공간 메모리를 대략 400메가바이트 정도 늘릴 수 있습니다. Java JVM 없이 MATLAB을 시작하려면 명령줄 옵션 -nojvm을 사용하십시오. 이 옵션을 사용하면 가장 큰 연속 메모리 블록의 크기도 비슷하게 늘어납니다. 가장 큰 연속 메모리 블록의 크기가 늘어나면 가능한 가장 큰 행렬 크기도 늘어납니다.

-nojvm을 사용하면 개발 환경 전체 등 Java 소프트웨어에 종속된 많은 기능을 사용하지 못하게 되는 단점이 있습니다. -nodesktop 옵션을 사용하여 MATLAB을 시작하면 절약되는 메모리의 양이 많지 않습니다.

참고 항목

관련 항목