メモリに収まらないデータの 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
の各行には時間が関連付けられていますが、Year
、Month
、DayofMonth
などの複数のテーブル変数に分割されています。これらのすべての 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 配列のいずれかになります。また、インメモリ配列 A
を tA = 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 配列の拡張を参照してください。
参考
gather
| tall
| datastore
| table
| mapreducer