메모리에 담을 수 없는 큰 데이터를 위한 tall형 배열
tall형 배열을 사용하면 datastore
가 지원되는 메모리에 상주하지 않는 큰 데이터에 대한 작업을 수행할 수 있습니다. 데이터저장소에서는 대규모 데이터 세트 전체를 메모리에 한 번에 불러오는 대신 이 데이터 세트를 메모리에 담을 수 있는 각각의 작은 블록 단위로 나눠 작업할 수 있습니다. tall형 배열은 일반적인 함수를 사용하여 메모리에 상주하지 않는 큰 데이터에 대한 작업을 수행할 수 있도록 이 기능을 확장합니다.
tall형 배열이란?
데이터를 한 번에 모두 메모리에 불러오지 않기 때문에 첫 번째 차원의 tall형 배열 크기가 임의적으로 커질 수 있습니다(즉, 가질 수 있는 행 개수에 제한이 없음). MapReduce 같은 기술로 대규모 데이터에 사용되는 특수 코드를 작성하는 대신, tall형 배열을 사용하면 메모리 내 MATLAB® 배열을 사용하는 것과 유사한 직관적인 방식으로 대규모 데이터 세트를 사용할 수 있습니다. 많은 핵심 연산자와 함수는 메모리 내 배열에서 작동하는 것과 동일하게 tall형 배열에서 작동합니다. MATLAB은 한 번에 작은 블록 단위의 데이터로 나눠서 작업하며 모든 데이터 청크화 작업과 처리 작업이 백그라운드에서 이루어지기 때문에 A+B
같은 일반적인 표현식으로 빅데이터 세트를 처리할 수 있습니다.
tall형 배열의 이점
메모리 내 배열과 달리 tall형 배열은 사용자가 gather
함수를 사용하여 계산 수행 요청을 하지 않으면 해당 데이터를 미평가 상태로 유지합니다. 이렇게 느긋한 계산법을 사용하면 대규모 데이터 세트를 신속히 처리할 수 있습니다. 나중에 gather
함수를 사용하여 출력값을 요청할 경우 MATLAB은 가능한 한 대기 중인 계산을 함께 처리할 수 있고, 데이터 통과 횟수를 최소화할 수 있습니다. 데이터 통과 횟수는 실행 시간에 큰 영향을 미치기 때문에 필요한 경우에만 출력값을 요청하는 것이 좋습니다.
참고
gather
함수가 결과를 메모리 내 MATLAB 배열로 반환하기 때문에 일반 메모리 고려 사항이 적용됩니다. 따라서 gather
함수에서 반환된 결과가 너무 큰 경우 MATLAB은 메모리 부족을 겪을 수도 있습니다.
tall형 테이블 만들기
tall형 테이블은 행 개수에 제한이 없다는 점만 제외하면 메모리 내 MATLAB 테이블과 유사합니다. 대규모 데이터 세트에서 tall형 테이블을 만들려면 먼저 해당 데이터를 위한 데이터저장소를 만들어야 합니다. 데이터저장소 ds
에 테이블 형식의 데이터가 포함되어 있으면 tall(ds)
는 이 데이터를 포함한 tall형 테이블 또는 tall형 타임테이블을 반환합니다. 데이터저장소를 만드는 방법에 대한 자세한 내용은 데이터저장소 항목을 참조하십시오.
항공편 데이터로 구성된 테이블 형식 파일을 가리키는 스프레드시트 데이터저장소를 만듭니다. 여러 파일이 포함된 폴더의 경우 전체 폴더 위치를 지정하거나 와일드카드 문자 '*.csv'
를 사용하여 파일 확장자가 동일한 여러 개의 파일을 데이터저장소에 포함시킬 수 있습니다. tabularTextDatastore
에서 누락된 값을 NaN
값으로 바꿀 수 있도록 'NA'
값을 누락된 값으로 처리하여 데이터를 정리합니다. 또한 몇 가지 텍스트 변수의 형식을 %s
로 설정하여 tabularTextDatastore
가 이 변수를 문자형 벡터로 구성된 셀형 배열로 읽어오도록 합니다.
ds = tabularTextDatastore('airlinesmall.csv'); ds.TreatAsMissing = 'NA'; ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'TailNum')} = '%s'; ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'CancellationCode')} = '%s';
데이터저장소에서 tall형 테이블을 만듭니다. 이 tall형 테이블에 대해 계산을 수행하면 기본 데이터저장소가 데이터의 블록을 읽어온 다음, 처리를 위해 tall형 테이블에 전달합니다. 데이터저장소와 tall형 테이블에는 어떠한 기본 데이터도 없습니다.
tt = tall(ds)
tt = M×29 tall table Year Month DayofMonth DayOfWeek DepTime CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted CarrierDelay WeatherDelay NASDelay SecurityDelay LateAircraftDelay ____ _____ __________ _________ _______ __________ _______ __________ _____________ _________ _______ _________________ ______________ _______ ________ ________ ______ _____ ________ ______ _______ _________ ________________ ________ ____________ ____________ ________ _____________ _________________ 1987 10 21 3 642 630 735 727 'PS' 1503 'NA' 53 57 NaN 8 12 'LAX' 'SJC' 308 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 26 1 1021 1020 1124 1116 'PS' 1550 'NA' 63 56 NaN 8 1 'SJC' 'BUR' 296 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 23 5 2055 2035 2218 2157 'PS' 1589 'NA' 83 82 NaN 21 20 'SAN' 'SMF' 480 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 23 5 1332 1320 1431 1418 'PS' 1655 'NA' 59 58 NaN 13 12 'BUR' 'SJC' 296 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 22 4 629 630 746 742 'PS' 1702 'NA' 77 72 NaN 4 -1 'SMF' 'LAX' 373 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 28 3 1446 1343 1547 1448 'PS' 1729 'NA' 61 65 NaN 59 63 'LAX' 'SJC' 308 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 8 4 928 930 1052 1049 'PS' 1763 'NA' 84 79 NaN 3 -2 'SAN' 'SFO' 447 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 1987 10 10 6 859 900 1134 1123 'PS' 1800 'NA' 155 143 NaN 11 -1 'SEA' 'LAX' 954 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : : :
위 화면을 보면 행 개수 M
을 현재 알 수 없다는 것을 확인할 수 있습니다. MATLAB은 일부 행만을 표시하며 세로 말줄임표 :
를 통해 tall형 테이블에 현재 표시되지 않은 행이 더 많이 있음을 알 수 있습니다.
tall형 타임테이블 만들기
사용 중인 데이터의 각 행이 시간과 연관된 경우 tall형 타임테이블을 사용하여 데이터 작업을 수행할 수 있습니다. tall형 타임테이블을 생성하는 방법에 대한 자세한 내용은 확장 기능(timetable
)을 참조하십시오.
다음과 같은 경우, tall형 테이블 tt
의 각 행이 시간과 연관되어 있지만 Year
, Month
, DayofMonth
등의 여러 테이블 변수로 나뉘어 있습니다. 이러한 모든 날짜/시간 정보를 하나의 새로운 tall datetime형 변수 Dates
(출발 시간 DepTime
을 기준으로 함)로 결합합니다. 그런 다음 Dates
를 행 시간값으로 사용하여 tall형 타임테이블을 만듭니다. Dates
가 테이블의 유일한 datetime형 변수이기 때문에 table2timetable
함수는 행 시간값에 이 변수를 자동으로 사용합니다.
hrs = (tt.DepTime - mod(tt.DepTime,100))/100; mins = mod(tt.DepTime,100); tt.Dates = datetime(tt.Year, tt.Month, tt.DayofMonth, hrs, mins, 0); tt(:,1:8) = []; TT = table2timetable(tt)
TT = M×21 tall timetable Dates UniqueCarrier FlightNum TailNum ActualElapsedTime CRSElapsedTime AirTime ArrDelay DepDelay Origin Dest Distance TaxiIn TaxiOut Cancelled CancellationCode Diverted CarrierDelay WeatherDelay NASDelay SecurityDelay LateAircraftDelay ____________________ _____________ _________ _______ _________________ ______________ _______ ________ ________ ______ _____ ________ ______ _______ _________ ________________ ________ ____________ ____________ ________ _____________ _________________ 21-Oct-1987 06:42:00 'PS' 1503 'NA' 53 57 NaN 8 12 'LAX' 'SJC' 308 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 26-Oct-1987 10:21:00 'PS' 1550 'NA' 63 56 NaN 8 1 'SJC' 'BUR' 296 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 23-Oct-1987 20:55:00 'PS' 1589 'NA' 83 82 NaN 21 20 'SAN' 'SMF' 480 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 23-Oct-1987 13:32:00 'PS' 1655 'NA' 59 58 NaN 13 12 'BUR' 'SJC' 296 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 22-Oct-1987 06:29:00 'PS' 1702 'NA' 77 72 NaN 4 -1 'SMF' 'LAX' 373 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 28-Oct-1987 14:46:00 'PS' 1729 'NA' 61 65 NaN 59 63 'LAX' 'SJC' 308 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 08-Oct-1987 09:28:00 'PS' 1763 'NA' 84 79 NaN 3 -2 'SAN' 'SFO' 447 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN 10-Oct-1987 08:59:00 'PS' 1800 'NA' 155 143 NaN 11 -1 'SEA' 'LAX' 954 NaN NaN 0 'NA' 0 NaN NaN NaN NaN NaN : : : : : : : : : : : : : : : : : : : : : : : :
tall형 배열 만들기
tall형 테이블 또는 tall형 타임테이블에서 변수를 추출할 경우 해당 기본 데이터형으로 구성된 tall형 배열이 생성됩니다. tall형 배열은 숫자형, 논리형, datetime형, duration형, calendarDuration형, categorical형, string형 또는 셀형 배열일 수 있습니다. 또한 메모리 내 배열 A
를 tA = tall(A)
를 사용해 tall형 배열로 변환할 수 있습니다. 메모리 내 배열 A
는 지원되는 데이터형 중 하나를 가져야 합니다.
tall형 타임테이블 TT
에서 도착 지연 시간 ArrDelay
를 추출합니다. 그러면 기본 데이터형이 double인 새 tall형 배열 변수가 생성됩니다.
a = TT.ArrDelay
a = M×1 tall double column vector 8 8 21 13 4 59 3 11 : :
classUnderlying
함수와 isaUnderlying
함수는 tall형 배열의 기본 데이터형을 확인하는 데 유용합니다.
느긋한 계산법
tall형 배열의 중요한 특성 중 하나는 tall형 배열로 작업할 때 대부분의 연산이 즉시 수행되지 않는다는 점입니다. 사용자가 확실히 계산 수행을 요청할 때까지 실제 계산을 보류해 두기 때문에 연산이 신속하게 실행되는 것처럼 보입니다. gather
함수(결과를 메모리로 가져옴)나 write
함수(결과를 디스크에 씀)를 사용하여 tall형 배열의 평가를 시작할 수 있습니다. size(X)
같이 간단한 명령도 10억 개의 행이 포함된 tall형 배열에서 실행하면 빠르게 계산하기 힘들기 때문에 이처럼 느긋한 계산법을 사용하는 것이 중요합니다.
tall형 배열로 작업할 때 MATLAB은 수행되는 모든 연산을 추적합니다. 그런 다음 이 정보는 gather
함수로 출력값을 요청할 때 필요한 데이터 통과 횟수를 최적화하는 데 사용됩니다. 따라서 미평가 tall형 배열로 작업하면서 필요한 경우에만 출력값을 요청하는 것이 일반적입니다. 자세한 내용은 Lazy Evaluation of Tall Arrays 항목을 참조하십시오.
도착 지연 시간의 평균과 표준편차를 계산합니다. 이러한 값을 기준으로 평균에서 표준편차 1 범위 내에 있는 지연 시간의 상한과 하한을 생성합니다. 각 연산 결과를 보면 배열이 아직 계산되지 않았음을 알 수 있습니다.
m = mean(a,'omitnan')
m = tall double ? Preview deferred. Learn more.
s = std(a,'omitnan')
s = tall ? Preview deferred. Learn more.
one_sigma_bounds = [m-s m m+s]
one_sigma_bounds = M×N×... tall array ? ? ? ... ? ? ? ... ? ? ? ... : : : : : : Preview deferred. Learn more.
gather
함수로 평가
느긋한 계산법의 이점은 MATLAB이 계산을 수행할 때 데이터 통과 횟수를 최소화하는 방식으로 연산을 결합할 수 있는 경우가 많다는 점입니다. 따라서 많은 연산을 수행할 때도 MATLAB은 반드시 필요한 경우에만 추가적인 데이터 통과를 수행합니다.
gather
함수는 대기 중인 모든 연산을 강제로 평가하고 결과 출력값을 메모리로 가져옵니다. 이런 이유로, tall형 배열과 메모리 내 배열을 연계하는 수단으로 gather
를 사용하는 것을 고려해 볼 수 있습니다. 예를 들어, tall 논리형 배열을 사용하면 if
루프 또는 while
루프를 제어할 수 없지만 gather
함수를 사용하여 이 배열을 평가하면 이러한 컨텍스트에서 사용할 수 있는 메모리 내 논리형 배열이 됩니다.
gather
는 MATLAB에서 전체 결과를 반환하기 때문에 결과가 메모리에 담길 수 있는지 확인해야 합니다.
gather
함수를 사용하여 one_sigma_bounds
를 계산한 후 결과를 메모리로 가져옵니다. 이 경우, one_sigma_bounds
를 계산하려면 여러 가지 연산이 필요하지만 MATLAB에서 이러한 연산을 한 번의 데이터 통과로 결합합니다. 이 예제의 데이터는 작기 때문에 gather
함수가 신속히 실행됩니다. 그러나 데이터 크기가 늘어날수록 데이터 통과 횟수를 줄이는 것이 더 중요합니다.
sig1 = gather(one_sigma_bounds)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 1.5 sec Evaluation completed in 1.8 sec sig1 = -23.4572 7.1201 37.6975
여러 tall형 배열을 한 번에 평가하려는 경우 gather
함수에 대한 입력값과 출력값을 여러 개 지정할 수 있습니다. 이 방법은 gather
함수를 여러 번 호출하는 것보다 더 빠릅니다. 예를 들어, 도착 지연 시간의 최솟값과 최댓값을 계산해 보겠습니다. 각 값을 따로 계산할 경우 각 값에 대해 데이터 통과가 한 번씩 필요하여 총 두 번의 통과에 대해 계산해야 합니다. 그러나 두 값을 동시에 계산할 경우 데이터 통과가 한 번만 필요합니다.
[max_delay, min_delay] = gather(max(a),min(a))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 1.1 sec Evaluation completed in 1.1 sec max_delay = 1014 min_delay = -64
결과를 통해, 대부분의 항공편이 평균적으로 약 7분 늦게 도착한다는 것을 알 수 있습니다. 그러나 이 값은 항공편의 1 표준편차 범위 내에(최대 37분 지연 또는 23분 조기 도착) 있습니다. 데이터 세트에서 가장 일찍 도착한 항공편은 약 1시간 빨랐고 가장 늦게 도착한 항공편은 수 시간 지연되었습니다.
tall형 배열 저장, 불러오기 및 검사 지점 생성
save
함수는 tall형 배열의 상태를 저장하지만 데이터를 복사하지는 않습니다. 결과로 나타나는 .mat
파일은 대개 크기가 작습니다. 그러나 이후에 load
를 사용하려면 원래 데이터 파일이 동일한 위치에 있어야 합니다.
write
함수는 데이터 복사본을 만들고 이 복사본을 여러 개의 파일로 저장하기 때문에 디스크 공간을 많이 쓸 수 있습니다. write
함수는 값을 쓰기 전에, 대기 중인 모든 tall형 배열에 대한 연산을 실행하여 값을 계산합니다. write
함수가 데이터를 복사하면 이 복사된 데이터는 원래 원시 데이터에 대해 독립적입니다. 따라서 원래의 원시 데이터를 더 이상 사용할 수 없더라도 복사된 파일에서 tall형 배열을 다시 만들어낼 수 있습니다.
파일이 작성된 위치를 가리키는 새 데이터저장소를 만들어 작성된 파일에서 tall형 배열을 다시 만들 수 있습니다. 이 기능을 사용하여 tall형 배열 데이터의 검사 지점이나 스냅샷을 만들 수 있습니다. 데이터 전처리는 데이터를 불러오기에 더 효율적인 형식으로 만드는 작업인데, 검사 지점 만들기는 이러한 데이터의 전처리 결과를 저장하기에 좋은 방법입니다.
tall형 배열 TA
가 있는 경우 다음 명령을 사용하여 이 tall형 배열을 폴더 location
에 쓸 수 있습니다.
write(location,TA);
나중에, 이 작성된 파일에서 TA
를 다시 생성하려면 다음 명령을 사용하십시오.
ds = datastore(location); TA = tall(ds);
그 외에도 write
함수를 사용하여 tall형 배열의 평가를 시작하고 그 결과를 디스크에 쓸 수 있습니다. 이렇게 write
함수를 사용하는 것은 gather
함수를 사용하는 것과 유사하지만 write
함수는 메모리에 결과를 저장하지 않습니다.
지원 함수
대부분의 핵심 함수는 메모리 내 배열에 대한 작업을 수행할 때와 동일한 방식으로 tall형 배열에 대한 작업을 수행합니다. 그러나 tall형 배열에 대한 함수의 작업 방식이 특수하거나 제한 사항이 있는 경우가 있습니다. 어떤 함수가 tall형 배열을 지원하는지 그리고 어떤 제한 사항이 있는지 알아보려면 그 함수 도움말 페이지의 맨 아래에서 확장 기능 섹션을 보십시오(예를 들어, filloutliers
참조).
tall형 배열을 지원하는 모든 MATLAB 함수를 필터링한 목록을 보려면 함수 목록(tall형 배열)을 참조하십시오.
tall형 배열은 머신러닝 알고리즘 작성, 독립 실행형 앱 배포, 병렬 계산 실행 또는 클러스터에서 계산 실행 같은 작업을 할 수 있는 여러 툴박스에서도 지원됩니다. 자세한 내용은 Extend Tall Arrays with Other Products 항목을 참조하십시오.
참고 항목
gather
| tall
| datastore
| table
| mapreducer