Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

メモリに収まらないデータの 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 table を作成するには、まずデータ用のデータストアを作成する必要があります。データストア ds に表形式データが含まれている場合、tall(ds) はデータを含む tall table または tall timetable を返します。データストアの作成の詳細については、データストアを参照してください。

航空会社の航空便データの表形式ファイルを指すスプレッドシート データストアを作成します。ファイルのコレクションを含むフォルダーの場合は、フォルダー全体の場所を指定するか、ワイルドカード文字 '*.csv' を使用して、同じファイル拡張子をもつ複数のファイルをデータストアに格納することができます。データを整理するには、'NA' 値を欠損データとして扱います。これにより、tabularTextDatastore がそれらを NaN 値に置き換えます。また、いくつかのテキスト変数の形式を %s に設定します。これにより、tabularTextDatastore がそれらを文字ベクトルの cell 配列として読み取ります。

ds = tabularTextDatastore('airlinesmall.csv');
ds.TreatAsMissing = 'NA';
ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'TailNum')} = '%s';
ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'CancellationCode')} = '%s';

データストアから tall table を作成します。この tall table に対して計算を実行するとき、基となるデータストアでは、データのブロックが読み取られ、それらが処理対象の tall table に渡されます。データストアと tall table のいずれにも、基となるデータは保持されません。

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 table に現在表示されていない、いくつかの行が存在することが示されます。

tall timetable の作成

操作するデータの各行に時間が関連付けられている場合は、tall timetable を使用してデータを操作することができます。tall timetable の作成については、拡張機能 (timetable) を参照してください。

この場合、tall table tt の各行には時間が関連付けられていますが、YearMonthDayofMonth などの複数のテーブル変数に分割されています。これらのすべての datetime 情報を、出発時間 DepTime に基づく 1 つの新しい tall datetime 変数 Dates に結合します。次に、Dates を行時間として使用して tall timetable を作成します。Dates はこの table 内の唯一の 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 table または tall timetable から変数を抽出すると、結果は対応する基となるデータ型の tall 配列になります。tall 配列は、数値配列、logical 配列、datetime 配列、duration 配列、カレンダー期間配列、categorical 配列、string 配列、cell 配列のいずれかになります。また、インメモリ配列 AtA = tall(A) によって tall 配列に変換できます。インメモリ配列 A はサポートされるいずれかのデータ型をもたなければなりません。

tall timetable 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 配列の重要点の 1 つに、それらを操作するとき、ほとんどの操作が即座に実行されないことがあります。これらの操作は高速に実行されるように見えますが、これは計算の実行が明確に要求されるまで実際の計算が延期されるためです。tall 配列の評価は、関数 gather (メモリに結果を格納) または関数 write (結果をディスクに書き込み) のいずれかによってトリガーできます。size(X) のような単純なコマンドでも、10 億行の tall 配列で実行した場合、迅速に計算されないため、この遅延評価は重要です。

tall 配列の操作中は、実行されるすべての操作が MATLAB によって追跡されます。その後、この情報は関数 gather で出力を要求するときに必要となり、データを通す回数を最適化するために使用されます。そのため、必要な場合にのみ未評価の tall 配列を処理し、出力を要求するようになっています。詳細については、tall 配列の遅延評価を参照してください。

到着遅延時間の平均と標準偏差を計算します。これらの値を使用して、平均の 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 によって、キューに登録されたすべての演算が強制的に評価されて、結果の出力はメモリに戻ります。このため、gather を tall 配列とインメモリ配列の間のブリッジと考えることができます。たとえば、tall logical 配列を使用して if または while ループを制御することはできませんが、この配列は gather で評価するとインメモリ logical 配列になるため、これらのコンテキストで使用できます。

gather は MATLAB での結果全体を返すため、結果がメモリに収まることを確認する必要があります。

gather を使用して one_sigma_bounds を計算し、結果をメモリに格納します。この場合、one_sigma_bounds を計算するにはいくつかの演算が必要ですが、MATLAB によって操作が結合され、データが 1 回だけ通されます。この例のデータは小さいため、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 を複数回呼び出すよりも高速です。たとえば、最小および最大到着遅延時間を計算します。別々に計算した場合、それぞれの値でデータを 1 回通す必要があるため、合計 2 回通して計算することになります。しかし、両方の値を同時に計算する場合は、データを通す必要があるのは 1 回のみになります。

[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 標準偏差内に入る航空便は 23 分早いものから 37 分遅いものまでになります。データセットの中で、最も早く到着した便は約 1 時間早く、最も遅い便は数時間遅れています。

tall 配列の保存、読み込み、およびチェックポイントの作成

関数 save は、tall 配列の "状態" を保存しますが、データはコピーしません。通常、結果の .mat ファイルは小さくなります。ただし、後で load を使用するためには、元のデータ ファイルが同じ場所に存在しなければなりません。

関数 write はデータのコピーを作成し、ファイルのコレクションとしてそのコピーを保存するため、大量のディスク領域を消費する場合があります。write は、書き込みの前に、tall 配列での保留中の操作をすべて実行して値を計算します。write が一度データをコピーすると、元の生データから独立したものになります。したがって、元の生データを使用できなくなった場合でも、書き込み済みのファイルから tall 配列を再作成できます。

ファイルが書き込まれた場所をポイントする新しいデータストアを作成することによって、書き込み済みのファイルから tall 配列を再作成できます。この機能によって、tall 配列データの "チェックポイント" または "スナップショット" を作成できます。チェックポイントの作成は、データの前処理の結果を保存する優れた方法で、データがより効率的に読み込める形式になります。

次のコマンドによって tall 配列 TA をフォルダー location へ書き込むことができます。

write(location,TA);

後で、書き込み済みのファイルから TA を再構築するには、次のコマンドを使用します。

ds = datastore(location);
TA = tall(ds);

さらに、関数 write を使用して、tall 配列の評価をトリガーし、結果をディスクに書き込むことができます。この write の使用方法は gather と似ていますが、write は結果をメモリに格納しません。

サポート関数

ほとんどの主要な関数は、インメモリ配列の操作と同じように tall 配列を操作できます。ただし、場合によっては、関数での tall 配列の操作方法が特殊であったり、制限があります。関数が tall 配列をサポートするかどうか、および何らかの制限があるかどうかは、「拡張機能」の節にある関数のリファレンス ページの下部で確認できます (たとえば、filloutliers を参照してください)。

tall 配列をサポートするすべての MATLAB 関数の一覧 (フィルター処理済み) については、関数リスト (tall 配列) を参照してください。

tall 配列はいくつかのツールボックスでもサポートされており、機械学習アルゴリズムの記述、スタンドアロン アプリの展開、および並列計算やクラスターでの計算の実行が可能です。詳細については、他の製品による tall 配列の拡張を参照してください。

参考

| | | |

関連するトピック