Main Content

tall 配列の遅延評価

tall 配列とインメモリ MATLAB® 配列の違いの 1 つは、一般的に tall 配列は計算の実行を要求するまで "未評価" のままになることです (この規則の例外には、plothistogram などのプロット関数、および fitlm などの統計近似関数の一部が含まれ、これらは tall array 入力を自動的に評価します)。tall 配列が未評価の状態の間、MATLAB では、そのサイズ、データ型、または含まれる特定の値を認識できない場合があります。ただし、その場合でも、値がわかっているかのように未評価の配列を計算で使用できます。これにより、各コマンドが実行されるのを待たなくても、大きなデータ セットを迅速に操作できます。このため、出力が必要な場合にのみ gather を使用することを推奨します。

MATLAB では、未評価の tall 配列に実行するすべての操作が入力時に追跡されます。最終的に、gather を呼び出してキューに入っている演算を評価すると、MATLAB は未評価のコマンドの履歴を使用して、データを通す回数を最小限に抑えることにより計算を最適化します。この 遅延評価 を適切に使用すれば、大きなデータ セットを通す必要がなくなるため、実行時間を大幅に短縮できます。

未評価の tall 配列の表示

未評価の tall 配列の表示は、MATLAB でその配列と値についてどれくらいの情報があるかによって変わります。次の 3 つの情報が表示に反映されます。

  • 配列のサイズ — 不明な次元のサイズは変数 M または N で表されて表示されます。既知の次元のサイズがない場合、サイズが MxNx.... と表示されます。

  • 配列データ型 — 配列の基となるデータ型が不明な場合、その型が tall array として表示されます。その型が既知の場合は、たとえば tall double array のように表示されます。

  • 配列の値 — 配列の値が不明な場合、? と表示されます。既知の値は表示されます。

計算の性質によっては、MATLAB で、特定の tall 配列についてのこれらの個々の情報がすべてまたは部分的に既知である場合や、まったく不明な場合があります。

たとえば、配列のデータ型はわかっているが、サイズと値が不明な場合、この未評価の tall 配列は次のように表示されます。

M×N×... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

データ型と相対的なサイズがわかっている場合、次のように表示されます。

 1×N tall char array

    ?    ?    ?   ...

一部のデータがわかっている場合、MATLAB はわかっている値を次のように表示します。

  100×3 tall double matrix

    0.8147    0.1622    0.6443
    0.9058    0.7943    0.3786
    0.1270    0.3112    0.8116
    0.9134    0.5285    0.5328
    0.6324    0.1656    0.3507
    0.0975    0.6020    0.9390
    0.2785    0.2630    0.8759
    0.5469    0.6541    0.5502
      :         :         :
      :         :         :

gather による評価

関数 gather は、tall 配列を評価するために使用します。gather は tall 配列を入力として受け取り、出力としてインメモリ配列を返します。このため、この関数を tall 配列とインメモリ配列の間のブリッジと考えることができます。たとえば、tall logical 配列を使用して if または while ループ ステートメントを制御することはできませんが、この配列は gather で評価するとインメモリ logical 値になるため、これらのコンテキストで使用できます。

gather は、tall 配列についてキューに入っているすべての演算を実行して、メモリ内に "全体" の結果を返します。gather は結果をインメモリ MATLAB 配列として返すため、通常のメモリに関する注意点を考慮します。gather によって返された結果が大きすぎると、MATLAB でメモリ不足が発生する可能性があります。

ほとんどの場合、特に計算に summean などのリダクション演算が含まれている場合に、gather を使用して計算全体の結果を確認できます。ただし、結果が大きすぎてメモリに収まらない場合、gather(head(X)) または gather(tail(X)) を使用して計算を実行し、結果の最初または最後の数行だけを参照することができます。

gather のエラーの解決

誤ったコマンドを入力したために gather が tall 配列変数の評価に失敗した場合、その変数をワークスペースから削除し、有効なコマンド "のみ" を使用して tall 配列を再作成しなければなりません。これは、未評価の tall 配列で実行するすべての操作が、入力時に MATLAB によって追跡されるためです。MATLAB で、誤りのあるステートメントについての記録を "消去" する唯一の方法は、tall 配列を最初から再作成することです。

例: tall 配列のサイズの計算

この例では、未評価の tall 配列の表示と、その配列の評価方法を説明します。

データ セット airlinesmall.csv のデータストアを作成します。データストアを tall table に変換し、サイズを計算します。

varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'};
ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ...
'SelectedVariableNames', varnames);
tt = tall(ds)
tt =

  M×4 tall table

    ArrDelay    DepDelay    Origin    Dest 
    ________    ________    ______    _____

        8          12       'LAX'     'SJC'
        8           1       'SJC'     'BUR'
       21          20       'SAN'     'SMF'
       13          12       'BUR'     'SJC'
        4          -1       'SMF'     'LAX'
       59          63       'LAX'     'SJC'
        3          -2       'SAN'     'SFO'
       11          -1       'SEA'     'LAX'
       :           :          :         :
       :           :          :         :
s = size(tt)
s =

  1×2 tall double row vector

    ?    ?

Preview deferred. Learn more.

tall 配列のサイズの計算によって返される答え (1 行 2 列のベクトル) は小さいですが、表示には tt のサイズを計算するためにはデータ全体を通す必要があることが示されます。

関数 gather を使用して、tall 配列を完全に評価し、結果をメモリに格納します。コマンドを実行するにつれて、コマンド ウィンドウに動的な進行状況が表示されるため、特に長い計算で役に立ちます。

メモ

gather によって返される結果がメモリに収まることを常に確認してください。mean などの関数を使用してサイズを削減せずに直接 gather を tall 配列に使用すると、MATLAB でメモリ不足が発生する可能性があります。

tableSize = gather(s)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.42 sec
Evaluation completed in 0.48 sec

tableSize =

      123523           4

例: tall 配列によるマルチパスの計算

この例では、データを通す回数の合計を最小限に抑えるために、複数の計算を結合する方法を説明します。

データ セット airlinesmall.csv のデータストアを作成します。データストアを tall table に変換します。

varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'};
ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ...
'SelectedVariableNames', varnames);
tt = tall(ds)
tt =

  M×4 tall table

    ArrDelay    DepDelay    Origin    Dest 
    ________    ________    ______    _____

        8          12       'LAX'     'SJC'
        8           1       'SJC'     'BUR'
       21          20       'SAN'     'SMF'
       13          12       'BUR'     'SJC'
        4          -1       'SMF'     'LAX'
       59          63       'LAX'     'SJC'
        3          -2       'SAN'     'SFO'
       11          -1       'SEA'     'LAX'
       :           :          :         :
       :           :          :         :

ArrDelay から DepDelay の平均値を減算して、新しい変数 AdjArrDelay を作成します。次に AdjArrDelay の平均値を計算し、この平均値を AdjArrDelay から減算します。これらの計算をすべて個別に行った場合、MATLAB ではデータを 4 回通す必要があります。

AdjArrDelay = tt.ArrDelay - mean(tt.DepDelay,'omitnan');
AdjArrDelay = AdjArrDelay - mean(AdjArrDelay,'omitnan')
AdjArrDelay =

  M×1 tall double column vector

    ?
    ?
    ?
    :
    :

Preview deferred. Learn more.

AdjArrDelay を評価し、最初の数行を表示します。いくつかの計算を結合できるため、データを通す必要があるのは 3 回のみです。

gather(head(AdjArrDelay))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 3: Completed in 0.4 sec
- Pass 2 of 3: Completed in 0.39 sec
- Pass 3 of 3: Completed in 0.23 sec
Evaluation completed in 1.2 sec

ans =

    0.8799
    0.8799
   13.8799
    5.8799
   -3.1201
   51.8799
   -4.1201
    3.8799

動作と推奨事項の概要

  1. tall 配列は、gather を使用して出力を要求するまで評価されません。つまり、遅延評価 と呼ばれる最適化です。

  2. tall 配列の計算を評価するには、ほとんどの場合 gather を使用します。計算の結果がメモリに収まらない可能性がある場合は、代わりに gather(head(X)) または gather(tail(X)) を使用します。

  3. 主に未評価の tall 配列を操作し、必要な場合にだけ出力を要求します。キューに入っている未評価の計算が多いほど、MATLAB でより高い最適化を行って、データを通す回数を最小限に抑えることができます。

  4. 誤った tall 配列コマンドを入力したために gather が tall 配列変数の評価に失敗した場合、その変数をワークスペースから削除し、有効なコマンド "のみ" を使用して tall 配列を再作成しなければなりません。

参考

|

関連するトピック