Main Content

ビッグ データの取り扱い

この例では、Simulink® モデルでビッグ データをシミュレーションへの入出力として取り扱う方法を説明します。

"ビッグ データ" とは、システム メモリに一度に読み込むには大きすぎるデータを指します。Simulink のシミュレーションでは、ビッグ データをシミュレーション出力として生成し、ビッグ データをシミュレーション入力として消費できます。ビッグ データは、入力と出力のどちらについても、ハード ディスク上の MAT ファイルに保存されます。このデータの小さいチャンクのみが、シミュレーション中の任意の時点でシステム メモリに読み込まれます。この方法は "ストリーミング" と呼ばれています。Simulink のシミュレーションでは、MAT ファイルとの間でデータをストリーミングできます。システムのハード ディスクの容量は通常、ランダム アクセス メモリの容量よりもはるかに大きいため、ストリーミングによりメモリの問題が解決されます。

ビッグ データをシミュレーションの出力としてストリーミングするために、ファイルへのログ記録が使用されます。その後、ファイルからのストリーミングはビッグ データをシミュレーションへの入力として提供します。

この例では、ビッグ データ シミュレーションの手法を示します。例の実行に要する時間を短縮するために、この例では、ほとんどのビッグ データ シミュレーションよりも短いシミュレーション期間を使用して少ないデータを生成します。

例を開く

例を開きます。この例では sldemo_mdlref_bus という名前のモデルを使用します。

openExample('simulink_features/WorkingWithBigDataExample');

モデルを閉じた場合は、例のフォルダーから再度開くことができます。

open_system('sldemo_mdlref_bus');

ファイルへのログ記録の設定

出力データを MAT ファイルにストリーミングするには、[コンフィギュレーション パラメーター]、[データのインポート/エクスポート]、[データセットのデータをファイルにログ] オプションを選択して、ファイルへのログ記録を有効にします。結果を含めるファイルの名前を指定することもできます。

ファイルへのログ記録をプログラムで有効にするには、モデル コンフィギュレーション パラメーター LoggingToFileon に設定します。

ファイルへのログ記録がモデルで有効になると、そのモデルのシミュレーションによりログ信号が直接 MAT ファイルにストリーミングされます。さらに、[状態] または [出力] コンフィギュレーション パラメーターが有効な場合に [形式] コンフィギュレーション パラメーターが Dataset に設定されると、それらの値も同じ MAT ファイルにストリーミングされます。

モデルのシミュレーション

sim コマンドを呼び出してモデルをシミュレートします。

信号のログの結果を保持する Dataset オブジェクトの名前を指定するには、SignalLoggingName コンフィギュレーション パラメーターを topOut に設定します。

結果の MAT ファイルの名前を指定するには、LoggingFileName コンフィギュレーション パラメーターを top.mat に設定します。StopTime コンフィギュレーション パラメーターは 5000 秒に設定します。ほとんどのビッグ データ シミュレーションでは、終了時間の値がかなり大きくなるため、ログに記録するデータ サンプルがはるかに多くなることに注意してください。

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 オブジェクト内の個々の信号をメモリに読み込まずに参照できます。たとえば、2 番目の信号を参照するには、次のコマンドを入力します。

sig2 = dsr{2};

sig2Values フィールドは SimulationDatastore オブジェクトです。これは、ディスクに保存された信号 2 のデータに対する非常に小さい参照です。

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 オブジェクトを作成します。その後、Dataset オブジェクトにログ信号への参照を要素番号 1 および 2 として配置します。

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_counter_bus をモデル sldemo_mdlref_bus のコンテキスト外で最上位モデルとして開きます。

open_system('sldemo_mdlref_counter_bus');

モデル sldemo_mdlref_counter_bus をシミュレートします。ds という名前の Dataset オブジェクトを入力として使用します。

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

SimulationDatastore オブジェクトで参照されるデータは、システムを圧倒することなくシミュレーションにストリーミングされます。

飽和の上限のデータは、その信号がインメモリの timeseries として指定されているためストリーミングされません。飽和制限の変更はスコープ内で時間 6 前後で反映されます。その時点から、信号が 30 ではなく 37 の値に飽和するようになります。

MATLAB® でのログ データのインクリメンタルな解析

SimulationDatastore オブジェクトでは MATLAB でログ データをインクリメントに解析できます。2 番目のログ信号への参照に戻り、データストアを新しい変数に割り当ててアクセスを簡略化します。

dst = sig2.Values;

SimulationDatastore オブジェクトでは参照データをインクリメントに読み取ることができます。この読み取りはチャンク単位で行われ、ReadSize プロパティによって制御されます。ReadSize の既定値は 100 サンプルです。信号の各サンプルはシミュレーションの単一のタイム ステップのログ データです。ReadSize の値を 1000 に変更します。データ ストアの読み取りごとにデータの timetable 表現を返します。

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

データ ストアで読み取りが行われるごとに、読み取りカウンターが増加します。このカウンターをリセットして、読み取りを最初から開始できます。

dst.reset;

SimulationDatastore オブジェクトを使用して、ログに記録されたシミュレーション データにインクリメントにアクセスしてビッグ データを解析します。データ レコード全体とチャンクを反復できます。

while dst.hasdata
    next_chunk = dst.read;
end

より長いシミュレーションについての検討

この例では、最初のシミュレーションから MAT ファイルへのデータのストリーミングに永続ストレージへのログ記録を使用した方法を示しています。さらに、2 回目のシミュレーションで、そのファイルからのデータを入力としてストリーミングしています。

より現実的なビッグ データの例では、モデルの StopTime コンフィギュレーション パラメーターの値がはるかに大きく、ログに記録された MAT ファイルが結果としてより大きくなります。2 回目のシミュレーションで、より長い終了時間を設定することもできます。出力と入力に大きなデータ ファイルを使用しても、より長いシミュレーションのメモリ要件は変わりません。

参考

|

関連するトピック