Main Content

빅데이터로 작업하기

이 예제에서는 Simulink® 모델이 시뮬레이션의 입력 및 출력으로 빅데이터를 처리하는 방법을 보여줍니다.

빅데이터는 너무 커서 시스템 메모리에 전부 한꺼번에 불러올 수 없는 데이터를 말합니다. Simulink 시뮬레이션은 시뮬레이션 출력으로 빅데이터를 생성하고 시뮬레이션 입력으로 빅데이터를 사용할 수 있습니다. 입력 및 출력 두 경우 모두 빅데이터는 하드 디스크의 MAT 파일에 저장됩니다. 시뮬레이션 중에는 언제든지 이 데이터의 작은 청크만 시스템 메모리로 불러옵니다. 이 접근 방식을 스트리밍이라고 합니다. Simulink 시뮬레이션은 MAT 파일로 또는 MAT 파일로부터 데이터를 스트리밍할 수 있습니다. 시스템의 하드 디스크 용량이 일반적으로 랜덤 액세스 메모리의 용량보다 훨씬 크기 때문에 스트리밍을 통해 메모리 문제를 해결할 수 있습니다.

소프트웨어는 파일로의 기록 기능을 사용하여 빅데이터를 시뮬레이션의 출력으로 스트리밍합니다. 그런 다음 파일로부터 스트리밍하면 시뮬레이션에 대한 입력으로 빅데이터가 제공됩니다.

이 예제에서는 빅데이터 시뮬레이션을 위한 전략을 보여줍니다. 이 예제에서는 실행하는 데 필요한 시간을 줄이기 위해 대부분의 빅데이터 시뮬레이션보다 더 짧은 시뮬레이션 지속 시간을 사용하고 더 적은 데이터를 생성합니다.

예제 열기

sldemo_mdlref_bus라는 모델을 사용하는 예제를 엽니다.

openExample('simulink_features/WorkingWithBigDataExample');

모델을 닫은 경우 예제 폴더에서 다시 열 수 있습니다.

open_system('sldemo_mdlref_bus');

파일로의 기록 기능 설정하기

출력 데이터를 MAT 파일로 스트리밍하려면 구성 파라미터 > 데이터 가져오기/내보내기 > Dataset 데이터를 파일에 기록 옵션을 선택하여 파일로의 기록을 활성화합니다. 결과를 포함할 파일의 이름을 지정할 수도 있습니다.

프로그래밍 방식으로 파일로의 기록 기능을 활성화하려면 모델 구성 파라미터 LoggingToFileon으로 설정하십시오.

모델에서 파일로의 기록 기능을 활성화하면 해당 모델의 시뮬레이션은 기록된 신호를 MAT 파일로 직접 스트리밍합니다. 또한 상태 또는 출력 구성 파라미터가 활성화되고 형식 구성 파라미터가 Dataset으로 설정된 경우 해당 값은 동일한 MAT 파일로 스트리밍됩니다.

모델 시뮬레이션하기

sim 명령을 호출하여 모델을 시뮬레이션합니다.

신호 기록 결과를 저장할 Dataset 객체의 이름을 지정하려면 SignalLoggingName 구성 파라미터를 topOut으로 설정합니다.

결과 MAT 파일의 이름을 지정하려면 LoggingFileName 구성 파라미터를 top.mat로 설정합니다. StopTime 구성 파라미터를 5,000초로 설정합니다. 대부분의 빅데이터 시뮬레이션에서 중지 시간은 훨씬 더 큰 값이 될 것이며, 이로 인해 기록할 데이터 샘플이 훨씬 더 많아지게 됩니다.

sim('sldemo_mdlref_bus','SignalLoggingName','topOut',...
    'LoggingToFile','on','LoggingFileName','top.mat',...
    'StopTime','5000');

MAT 파일 내의 기록된 데이터셋을 참조하는 DatasetRef 객체 만들기

DatasetRef 객체를 사용하여 기록된 MAT 파일에서 결과 Dataset 객체를 참조합니다. DatasetRef 객체를 사용하면 참조된 MAT 파일을 메모리로 불러오지 않습니다. DatasetRef 객체는 파일에 저장된 Dataset 객체를 참조하기 위한 가벼운 래퍼 개체입니다. 반면, 이 파일에서 load 함수를 호출하면 소프트웨어가 전체 파일을 메모리로 불러오며, 이는 Dataset 객체에 빅데이터가 포함된 경우에는 불가능할 수 있습니다.

dsr = Simulink.SimulationData.DatasetRef('top.mat','topOut');

기록된 신호에 대한 참조 얻기

DatasetRef 객체의 { } 인덱싱을 사용하면 신호를 메모리로 불러오지 않고도 Dataset 객체 내의 개별 신호를 참조할 수 있습니다. 예를 들어, 초 신호를 참조하려면 다음 명령을 입력합니다.

sig2 = dsr{2};

sig2Values 필드는 신호 2의 데이터에 대한 경량 참조인 SimulationDatastore 객체로, 디스크에 저장되어 있습니다.

sig2.Values
ans = 

  SimulationDatastore with properties:

      ReadSize: 100
    NumSamples: 50001
      FileName: '/tmp/Bdoc24a_2511836_2277581/tp91fad388/simulink_features-ex31145726/top.mat'

    Data Preview:

     Time       Data 
    _______    ______

    0 sec      1    5
    0.1 sec    1    5
    0.2 sec    2    6
    0.3 sec    2    6
    0.4 sec    3    7
    :          :

기록된 다른 신호에 대한 추가 참조 얻기

기록된 신호 중 일부를 참조된 모델의 시뮬레이션에 대한 입력으로 사용할 수 있습니다. Model 블록의 입력 포트에 연결되는 각 기록된 신호에 대한 경량 참조를 생성합니다. 이 예제에서 버스는 Model 블록 입력 포트에 연결됩니다. 결과 Values 필드는 SimulationDatastore 객체로 구성된 구조체입니다. 각 구조체는 원래 버스의 계층 구조를 반영합니다.

counterbus = dsr{1};
incrementbus = dsr{3};

시뮬레이션 입력으로 사용할 Dataset 객체 만들기

Dataset 객체를 사용하여 시뮬레이션에 대한 입력 신호를 지정합니다. 이 Dataset 객체의 각 요소는 동일한 인덱스에 해당하는 Inport 블록에 입력 데이터를 제공합니다. ds라는 빈 Dataset 객체를 만듭니다. 그런 다음 기록된 신호에 대한 참조를 요소 번호 1과 2로 Dataset 객체에 배치합니다.

Dataset 객체에서 { } 인덱싱을 사용하여 요소를 정렬합니다.

ds = Simulink.SimulationData.Dataset;
ds{1} = counterbus;
ds{2} = incrementbus;

Dataset 객체의 각 요소 내에서 신호 데이터(예: SimulationDatastore 객체)에 대한 참조를 메모리 내 데이터(예: timeseries 객체)와 혼합할 수 있습니다. 포화 상한 중 하나를 30에서 37로 변경하려면 다음 명령을 입력하십시오.

ds{1}.Values(2).limits.upper_saturation_limit = timeseries(int32(37),0);

입력 데이터를 시뮬레이션으로 스트리밍하기

모델 sldemo_mdlref_bus의 컨텍스트 밖에서, 참조된 모델 sldemo_mdlref_counter_bus를 최상위 모델로 엽니다.

open_system('sldemo_mdlref_counter_bus');

sldemo_mdlref_counter_bus 모델을 시뮬레이션합니다. ds라는 이름의 Dataset 객체를 입력으로 사용합니다.

out = sim('sldemo_mdlref_counter_bus', ...
          'LoadExternalInput','on','ExternalInput','ds');

SimulationDatastore 객체가 참조하는 데이터는 시스템에 부담을 주지 않으면서 시뮬레이션으로 스트리밍됩니다.

포화 상한에 해당하는 데이터는 해당 신호가 메모리 내 시계열로 지정되어 있기 때문에 스트리밍되지 않습니다. 포화 한도의 변화는 스코프에서 시간 6 부근에서 반영됩니다. 신호는 이제 값 30 대신 37로 포화됩니다.

기록된 데이터를 MATLAB®에서 단계적으로 분석하기

SimulationDatastore 객체를 사용하면 기록된 데이터를 MATLAB에서 단계적으로 분석할 수 있습니다. 두 번째로 기록된 신호에 대한 참조로 돌아가서 데이터저장소를 새 변수에 할당하여 액세스를 단순화합니다.

dst = sig2.Values;

SimulationDatastore 객체를 사용하면 참조된 데이터를 단계적으로 읽을 수 있습니다. 읽기는 청크 단위로 수행되며 ReadSize 속성에 의해 제어됩니다. ReadSize의 디폴트 값은 샘플 100개입니다. 신호의 각 샘플은 시뮬레이션의 단일 시간 스텝에 대해 기록된 데이터입니다. ReadSize 값을 1000으로 변경합니다. 데이터저장소를 읽어 들일 때마다 데이터의 타임테이블 표현이 반환됩니다.

dst.ReadSize = 1000;
tt = dst.read;

데이터저장소에서 읽어 들일 때마다 읽기 카운터가 증가합니다. 이 카운터를 재설정하고 처음부터 읽기를 시작할 수 있습니다.

dst.reset;

빅데이터 분석을 위해 기록된 시뮬레이션 데이터에 단계적으로 액세스하려면 SimulationDatastore 객체를 사용하십시오. 전체 데이터 레코드 및 청크에 대해 반복할 수 있습니다.

while dst.hasdata
    next_chunk = dst.read;
end

더 긴 시뮬레이션 고려하기

이 예제에서는 영구 스토리지로의 기록을 사용하여 첫 번째 시뮬레이션에서 얻은 데이터를 MAT 파일로 스트리밍하는 방법을 보여줍니다. 그런 다음 두 번째 시뮬레이션은 해당 파일의 데이터를 입력으로 스트리밍합니다.

보다 현실적인 빅데이터 예에서는 모델 StopTime 구성 파라미터의 값이 더 크므로 기록된 MAT 파일이 더 커집니다. 두 번째 시뮬레이션도 더 긴 중지 시간으로 구성될 수 있습니다. 그러나 출력 및 입력을 위해 더 큰 데이터 파일을 사용하더라도 더 긴 시뮬레이션을 위한 메모리 요구 사항은 동일하게 유지됩니다.

참고 항목

|

관련 항목