このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
高大配列は,MATLAB従来の®構文を使用して大規模なデ,タセットを扱うための強力で直感的な方法です。ただし,高配列は,それぞれが個別にメモリに収まるデータ ブロックを操作するため、ほとんどの関数の従来のアルゴリズムは、tall 配列をサポートするために並列化アプローチを使用するよう更新しなければなりません。このトピックでは、tall 配列を操作するための独自の並列化アルゴリズムの開発方法を説明します。
カスタム関数を高配列に適用するために現在使用できるアプロ,チは,次のとおりです。
単一ステップの変換操作:高配列内のデ,タブロックに関数を適用します。
2ステップのリダクション演算:高配列に関数を適用して内容を変換したうえで,関数をもう1つ適用して出力を単一のブロックに縮小します。
スラ@ @ディングウィンドウ操作:高配列に移動ウィンドウ関数を適用して内容を変換します。
どの操作を選択するかに関わりなく,すべてのアプローチに適用されるオプション,パフォーマンス上の考慮事項,および一般的な問題があります。
ほとんどの一般的な数学関数とMATLAB演算では,既にtall配列がサポ,トされています。機能が既にサポ,トされている場合は,独自のアルゴリズムを作成する必要はないかもしれません。
以下に,高配列用のカスタムアルゴリズムを実装することが望ましい理由をいくか示します。
現在サポ,トされていない関数の実装——特定の関数が現在高配列をサポートしていない場合は,ここで概説するAPIを使用して,高配列をサポートするその関数のバージョンを作成できます。
既存のコ,ドの活用——インメモリデータに対していくつかの操作を実行する既存のコードがある場合は,わずかな変更だけで,高配列を扱うように互換性をもたせることができます。このアプローチでは,高配列をサポートするMATLAB言語のサブセットに合わせてコードを変換する必要がありません。
パフォ,マンスの向上——たとえば,MATLAB関数をc++墨西哥人関数として書き換えることができ,ここで概説するAPIを使用して,データを扱う墨西哥人関数を呼び出すことができます。
優先外部ラ@ @ブラリの使用——組織内での互換性のために,特定の外部ライブラリを特定の計算に使用するよう求められる場合があります。ここで概説するAPIを使用して,これらの外部ラaaplブラリの関数を再実装することができます。
サポ,トされているAPIは高度な使用を目的としており,広範な入力チェックは含まれていません。実装した補助関数がすべての要件を満たし,期待どおりの計算を行えることをテストするには,ある程度の時間がかかることが予想されます。tall配列アルゴリズムを作成するために現在サポ,トされているAPIを次に示します。
パッケ,ジ関数名 | 説明 |
---|---|
matlab.tall.transform |
指定された関数を1以上の高配列の各ブロックに適用します。 |
matlab.tall.reduce |
指定された関数を1以上の高配列の各ブロックに適用します。その後,この関数の出力を2目のリダクション関数に渡します。 |
matlab.tall.movingWindow |
移動ウィンドウ関数をデ,タブロックに適用します。 |
matlab.tall.blockMovingWindow |
移動ウィンドウ関数およびブロック削減をパディングされたデ,タブロックに適用します。 |
データストアから高配列を作成すると,基となるデータストアによって,計算中のデータの移動が容易になります。デタは“ブロック”と呼ばれる別々の要素に分かれて移動します。各ブロックはメモリに収容可能な連続する行のセットです。たとえば,2 次元配列 (table など) の 1 つのブロックはX (n: m:)
です。各ブロックのサ@ @ズは,デ@ @タストアのReadSize
プロパティの値に基づいていますが,ブロックが必ずしも正確にそのサ。高配列アルゴリズムを開発する場合、tall 配列はそうした多数のブロックを垂直方向に連結したものと見なされます。
配列のブロックは,使用可能なメモリに基づいて実行時に選択されるため,動的となる場合があります。そのため,ブロックは実行ごとに“厳密には”同じサ电子邮箱ズにならないことがあります。コンピューターで,使用可能なメモリに影響を与える変更がある場合,それがブロックのサイズに影響を与える可能性があります。
このペ,ジでは,2次元の観点から“ブロック”と“行”に言及していますが,この概念はN次元の高配列に拡張されます。ブロックサ▪▪▪▪ズは最初の次元でのみ制約されるため,ブロックには,たとえばX (n: m,:,:,…)
のように他の次元の要素がすべて含まれます。また,n次元配列には,行ではなくX (p::,…)
のような“スラaapl . exeス”が含まれています。
関数matlab.tall.transform
は,高配列の各ブロックに1つの関数を適用するため,データの変換,フィルター処理,または削減をブロック単位で適用するために使用できます。たとえば,特定の値をもつ行を削除し,データのセンタリングやスケーリングを行い,あるいは特定の条件を検出して特定データを変換することができます。以下の図は,matlab.tall.transform
によって配列のブロックを操作したときの動作を示しています。
操作 |
説明 | 例 |
---|---|---|
|
変換-各ブロックの行数は同じままですが、値が変わります。 |
|
|
フィルタ,処理-各ブロックの行数が減少します。そのため,新しい配列内のブロックには前に他のブロックにあった行が含まれる可能性があります。 |
|
単一ステップの変換を適用する汎用構文は,次のとおりです。
[tA, tB, tC,…]= matlab.tall.transform(fcn, tX, tY, tZ, ...)
fcn
の機能要件fcn
の一般的な関数シグネチャは,次のとおりです。
[a, b, c,…]= fcn(x, y, z, ...)
fcn
は以下の要件を満たさなければなりません。
入力引数-入力[x, y, z,…]
は,メモリに収まるデ,タのブロックです。ブロックは,高配列の入力[tX, tY, tZ,…]
それぞれからデ,タを抽出することによって生成されます。入力[x, y, z,…]
は次の特性を満たします。
[x, y, z,…]
はすべて,任意の可能な拡張後の最初の次元が同じサaaplズをも。
[x, y, z,…]
のデータブロックは,高配列の高次元が1ではないと仮定した場合,高次元の同じインデックスから得られる。たとえば,tX
と泰
の高次元が1ではない場合,ブロックの最初のセットはx = tX(1:2000,:)
およびy = tY(1:2000,:)
になる可能性があります。
[tX, tY, tZ,…]
のいずれかの最初の次元がサ@ @ズ1
である場合,対応するブロック[x, y, z,…]
は,その高配列内のすべてのデ,タで構成される。
出力引数-出力[a, b, c,…]
はメモリに収まるブロックで,それぞれの出力[tA, tB, tC,…]
に送信されます。出力[a, b, c,…]
は以下の特性を満たします。
[a, b, c,…]
はすべて,最初の次元が同じサ。
[a, b, c,…]
はすべて,fcn
の以前の呼び出しの結果とそれぞれ垂直方向に連結される。
[a, b, c,…]
はすべて,それぞれの出力先で,出力配列の最初の次元にある同じesc escンデックスに送信される。
関数ル,ル- - - - - -fcn
は関数ル,ルを満たさなければなりません。
F ([inputs1;inputs2) == [F(inputs1);F (inputs2))
:入力の連結に関数を適用することは,入力に関数を個別に適用してから結果を連結する場合と同じでなければならない。
空の入力- - - - - -fcn
が高さ0の入力を処理できることを確認します。空の入力は,ファイルが空の場合や、データに対して数多くのフィルター処理を行った場合に発生することがあります。
matlab.tall.reduce
は2つの関数を高配列に適用し,最初のステップの結果を最後のリダクションステップに入力として送ります。リダクション関数は,メモリに収まる単一の最終ブロックが得られるまで,中間結果に繰り返し適用されます。MapReduceのパラダイムでは,この処理は”単一キー”のMapReduce演算に似ています。そこでは,中間結果がすべて同じキ,をも,リダクションステップで結合されます。
最初のステップはmatlab.tall.transform
に似ており,その要件は同じです。ただし,リダクション ステップでは、中間結果がメモリに収まる単一のブロックへと常に縮小されます。以下の図は、matlab.tall.reduce
によって配列のブロックを操作したときの動作を示しています。
操作 |
説明 | 例 |
---|---|---|
|
変換+リダクション——各ブロックの行数は最初のステップの後も同じままで,その後,中間結果が1つのブロックに縮小されます。 |
|
|
フィルタ,処理+リダクション-最初のステップで、各ブロックの行数が減らされます。その後,中間結果が1ブロックへと縮小されます。 |
|
2ステップのリダクションを適用する汎用構文を次に示します。
[rA, rB, rC,…]= matlab.tall.reduce(fcn, reducefcn, tX, tY, tZ, ...)
fcn
の関数シグネチャは,次のとおりです。
[a, b, c,…]= fcn(x, y, z, ...)
reducefcn
の関数シグネチャは,次のとおりです。
[rA, rB, rC,…]= reducefcn(a, b, c, ...)
まり,入力の高配列[tX, tY, tZ,…]
は,fcn
への入力であるブロック[x, y, z,…]
に分割されます。その後,fcn
はreducefcn
への入力である出力[a, b, c,…]
を返します。最後に,reducefcn
は,matlab.tall.reduce
によって返される最終的な結果[rA, rB, rC]
を返します。
reducefcn
の機能要件fcn
の要件は,FCNの機能要件で概説したものと同じです。ただし,reducefcn
の要件は異なります。
reducefcn
の一般的な関数シグネチャは,次のとおりです。
[rA, rB, rC,…]= reducefcn(a, b, c, ...)
reducefcn
は以下の要件を満たさなければなりません。
入力引数-入力[a, b, c,…]
はメモリに収まるブロックです。デ,タのブロックは,fcn
によって返される出力か,さらなる縮小のために再度処理される,ある程度縮小されたreducefcn
からの出力のいずれかです。入力[a, b, c,…]
は次の特性を満たします。
入力[a, b, c,…]
は,最初の次元が同じサ。
最初の次元の特定▪▪ンデックスに▪▪いて,デ▪▪タ[a, b, c,…]
のブロックの各行は入力から派生するか,またはreducefcn
に対する以前の同じ呼び出しから派生する。
最初の次元の特定▪▪ンデックスに▪▪いて,その▪▪ンデックスの入力[a, b, c,…]
の各行は,最初の次元の同じ。
出力引数-すべての出力[rA, rB, rC,…]
は,最初の次元が同じサ。さらに,必要に応じて縮小を繰り返すことができるように,それぞれの入力[a, b, c,…]
と垂直方向に結合可能でなければなりません。
関数ル,ル- - - - - -reducefcn
は,以下の関数ル,ルを満たさなければなりません(丸め誤差を含む)。
F(input) == F(F(input))
:同じ入力に繰り返し関数を適用しても,結果が変わってはならない。
F ([input1;input2) == F([input2;input1])
:結果が,連結の順序に依存することがあってはならない。
F ([input1;input2) == F([F(input1);F (input2)])
:いくつかの中間結果の連結に関数を1回適用することは,それを別々に適用し,連結し,再び適用することと同じでなければならない。
空の入力- - - - - -reducefcn
が高さ0の入力を処理できることを確認します。空の入力は,ファイルが空の場合や、データに対して数多くのフィルター処理を行った場合に発生することがあります。この呼び出しでは、すべての入力ブロックは、最初の次元以外で正しい型とサイズをもつ空の配列となります。
関数matlab.tall.movingWindow
およびmatlab.tall.blockMovingWindow
は,高配列内のデ,タのウィンドウに関数を適用します。matlab.tall.transform
とmatlab.tall.reduce
は一度にデータブロック全体に対して操作を行いますが,移動ウィンドウ関数は,ウィンドウが配列の先頭から末尾まで移動する際にデータのウインドウに対して操作を行います。ウィンドウは,ディスクから読み取られるデ,タの複数のブロックにまたがることができます。
以下の図は,matlab.tall.movingWindow
またはmatlab.tall.blockMovingWindow
によって配列のブロックを操作したときの動作を示しています。
操作 | 説明 | 例 |
---|---|---|
|
ウィンドウ変換-各ブロックの行数は同じままですが、値が変わります。出力は,不完全なデータ ウィンドウと完全なデータ ウインドウの両方に対して実行された操作の結果を含みます。
|
|
|
ウィンドウフィルタ,処理—不完全なデタウィンドウが破棄されるため,出力の要素数は入力より少なくなります。出力は,完全なデ,タウィンドウに対して行った操作の結果のみを含みます。
|
|
matlab.tall.movingWindow
とmatlab.tall.blockMovingWindow
を使用して,デ,タにウィンドウ変換やフィルタ,を適用できます。たとえば,末尾平均や移動中央値を計算したり、一度に複数の操作を同じウィンドウに対して適用することができます。2 つの関数は次の点で違いがあります。
matlab.tall.movingWindow
は,ウィンドウが完全かどうかにかかわらず,すべてのデ,タウィンドウにfcn
を適用します。matlab.tall.blockMovingWindow
は,不完全なデ,タウィンドウにwindowfcn
を適用し,完全なデ,タウィンドウにはblockfcn
を適用します。
matlab.tall.movingWindow
は一度に1のデタウィンドウに対して操作を行います。matlab.tall.blockMovingWindow
は,複数の完全なウィンドウを含んだデータブロック全体に対して操作を行うため,計算に必要な関数呼び出しの数が少なくなります。
移動ウィンドウ操作を1のデタウィンドウに適用する構文は次のとおりです。
[tA, tB, tC,…]= matlab.tall.movingWindow(fcn, window, tX, tY, tZ, ...)
fcn
の関数シグネチャは次のようにしなければなりません。
[a, b, c,…]= fcn(x, y, z, ...)
同様に,移動ウィンドウ操作をデ,タブロック全体に適用する構文は次のとおりです。
[tA, tB, tC,…]= matlab.tall.blockMovingWindow(windowfcn, blockfcn, window, tX, tY, tZ, ...)
windowfcn
およびblockfcn
の関数シグネチャは次のようにしなければなりません。
[a, b, c,…]= windowfcn(info, x, y, z, ...) [a, b, c, ...] = blockfcn(info, bX, bY, bZ, ...)
入力信息
は,窗口
および步
フィ,ルドを含む構造体です。関数を作成するときに、これらのフィールドを使用して各ブロックからデータのウィンドウを選択します。
fcn
、windowfcn
,およびblockfcn
が従わなければならない一般規則の概要にいては,FCNの機能要件を参照してください。入力信息
を除けば,fcn
とwindowfcn
の要件は同じです。しかし,関数blockfcn
はデ,タブロック全体に対して操作を行うため,要件が異なります。
windowfcn
の機能要件windowfcn
の一般的な関数シグネチャは,次のとおりです。
[a, b, c,…]= windowfcn(info, x, y, ...)
信息
は,matlab.tall.blockMovingWindow
によって提供される構造体で,以下のフィ,ルドを含みます。
步
—ウィンドウ間の指定ステップサaapl . aapl .ズ(既定の設定:1)。この値は名前と値のペア“步”
で設定します。
窗口
-指定のウィンドウサie浏览器ズ。この値は窗口
入力引数で設定します。
windowfcn
は以下の要件を満たさなければなりません。
入力引数-入力[x, y, z,…]
は,メモリに収まるデ,タのブロックです。ブロックは,高配列の入力[tX, tY, tZ,…]
それぞれからデ,タを抽出することによって生成されます。入力[x, y, z,…]
は次の特性を満たします。
すべての入力[x, y, z,…]
は最初の次元が同じサ@ @ズとなる。
[x, y, z,…]
のデータブロックは,高配列の高次元が1ではないと仮定した場合,高次元の同じインデックスから得られる。たとえば,tX
と泰
の高次元が1ではない場合,ブロックの最初のセットはx = tX(1:2000,:)
およびy = tY(1:2000,:)
になる可能性があります。
[tX, tY, tZ,…]
のいずれかの最初の次元がサ@ @ズ1
である場合,対応するブロック[x, y, z,…]
は,その高配列内のすべてのデ,タで構成される。
windowfcn
の配列のスラ。
入力が行列,N次元配列,表,または时间表である場合,windowfcn
を適用することで,その各列または各変数における入力デ,タが削減されなければなりません。
出力引数-出力[a, b, c,…]
はメモリに収まるブロックで,それぞれの出力[tA, tB, tC,…]
に送信されます。出力[a, b, c,…]
は以下の特性を満たします。
出力[a, b, c,…]
はすべて,最初の次元が同じサ。
出力[a, b, c,…]
はすべて,windowfcn
の以前の呼び出しの結果とそれぞれ垂直方向に連結される。
出力[a, b, c,…]
はすべて,それぞれの出力先で,出力配列の最初の次元にある同じesc escンデックスに送信される。
関数ル,ル- - - - - -windowfcn
は以下の関数ル,ルを満たしていなければなりません。
F ([inputs1;inputs2) == [F(inputs1);F (inputs2))
:入力の連結に関数を適用することは,入力に関数を個別に適用してから結果を連結する場合と同じでなければならない。
blockfcn
の機能要件blockfcn
の一般的な関数シグネチャは,次のとおりです。
[a, b, c,…]= blockfcn(info, bX, bY, bZ, ...)
信息
は,matlab.tall.blockMovingWindow
によって提供される構造体で,以下のフィ,ルドを含みます。
步
—ウィンドウ間の指定ステップサaapl . aapl .ズ(既定の設定:1)。この値は名前と値のペア“步”
で設定します。
窗口
-指定のウィンドウサie浏览器ズ。この値は窗口
入力引数で設定します。
matlab.tall.blockMovingWindow
がblockfcn
に提供するデ,タブロックbX, bY, bZ,…
には次の特性があります。
ブロックにはフルサ@ @ズのウィンドウのみが含まれる。blockfcn
は不完全なデ,タウィンドウに対する動作を定義する必要はありません。
最初のデ,タウィンドウは,ブロックの最初の要素から開始する。最後のウィンドウの最後の要素は,ブロックの最後の要素です。
blockfcn
は以下の要件を満たさなければなりません。
入力引数-入力[bX, bY, bZ,…]
は,メモリに収まるデ,タのブロックです。ブロックは,高配列の入力[tX, tY, tZ,…]
それぞれからデ,タを抽出することによって生成されます。入力[bX, bY, bZ,…]
は次の特性を満たします。
入力[bX, bY, bZ,…]
はすべて,任意の可能な拡張後の最初の次元が同じサaaplズをも。
[bX, bY, bZ,…]
のデータブロックは,高配列の高次元が1ではないと仮定した場合,高次元の同じインデックスから得られる。たとえば,tX
と泰
の高次元が1ではない場合,ブロックの最初のセットはbX = tX(1:2000,:)
およびbY = tY(1:20000,:)
になる可能性があります。
デ,タ入力[tX, tY, tZ,…]
のいずれかの最初の次元がサ@ @ズ1
である場合,対応するブロック[bX, bY, bZ,…]
は,その高配列内のすべてのデ,タで構成される。
blockfcn
を適用した結果,入力データがブロック内のウィンドウの数と等しい高さになるよう削減されなければならない。ブロック内のウィンドウの数を特定するには信息。窗口
と信息。步
を使用できます。
入力が行列,N次元配列,表,または时间表である場合,blockfcn
を適用した結果,入力デ,タはその各列または各変数において削減されなければなりません。
出力引数-出力[a, b, c,…]
はメモリに収まるブロックで,それぞれの出力[tA, tB, tC,…]
に送信されます。出力[a, b, c,…]
は以下の特性を満たします。
出力[a, b, c,…]
はすべて,最初の次元が同じサ。
出力[a, b, c,…]
はすべて,blockfcn
の以前の呼び出しの結果とそれぞれ垂直方向に連結される。
出力[a, b, c,…]
はすべて,それぞれの出力先で,出力配列の最初の次元にある同じesc escンデックスに送信される。
関数ル,ル- - - - - -blockfcn
は以下の関数ル,ルを満たしていなければなりません。
F ([inputs1;inputs2) == [F(inputs1);F (inputs2))
:入力の連結に関数を適用することは,入力に関数を個別に適用してから結果を連結する場合と同じでなければならない。
サポ,トされているAPIのいずれかからの最終的な出力に入力と異なるデ,タ型がある場合は,名前と値のペア“OutputsLike”
を指定して,対応する出力と同じデタ型と属性をも1以上のプロトタプ配列を提示“しなければなりません”。“OutputsLike”
の値は常に细胞配列であり,各细胞には対応する出力引数のプロトタイプ配列が含まれます。
たとえば,次のmatlab.tall.transform
の呼び出しは,1の高配列tX
を入力として受け取り,プロトタprotoA
およびprotoB
によって指定された異なる型をも2の出力を返します。出力一个
はprotoA
と同じデタ型と属性をも,B
とprotoB
の場合も同様です。
C = {protoA protoB};[A, B] = matlab.tall。transform(fcn, tX, 'OutputsLike', C)
プロトタ@ @プ配列を提供する一般的な方法は,適切なデ@ @タ型の自明な入力でfcn
を呼び出すことです。これは,fcn
によって返される出力が正しいデ,タ型になるためです。この例では,変換関数が高双を受け取り,高桌を返します。プロトタ@ @プ配列はfcn (0)
の呼び出しによって生成され,プロトタ“OutputsLike”
の値として指定されます。
ds = tabularTextDatastore(' airlinsmall .csv','TreatAsMissing','NA');ds。SelectedVariableNames = {'ArrDelay', 'DepDelay'};Tt =高(ds);tX = tt.ArrDelay;fcn = @(x) table(x,'VariableNames',{'MyVar'});proto_A = fcn(0);A = matlab.tall.transform(fcn,tX,'OutputsLike',{proto_A});
不必要な入れ子関数を使用するのではなく,1つの関数にすべての解析を組み込んで呼び出し,データを直接操作します。
デ,タの小さなサブセットを使用して実験します。データセット全体にスケールアップするとボトルネックが強く拡大されて現れる可能性があるため,その前にコードをプロファイリングしてボトルネックを見つけ,修正します。
一部の関数は入力デ,タに応じて異なる形状の出力を返すため,デ,タの方向に注意してください。たとえば,独特的
は入力デ,タの方向に応じて,行ベクトルまたは列ベクトルのいずれかを返すことができます。
ブロックは,使用可能なコンピュ,タ,メモリに基づいて実行時に動的に生成されます。指定されたすべてのリダクション関数が,関数ル,ルF ([input1;input2) == F([F(input1);F (input2)])
に従っていることを確認してください。このル,ルに従っていない場合,結果は試行間で大きく異なってくることがあります。
ブロックの最初の次元は,0や1を含め任意のサescズにできます。サイズ0または1はフィルター処理やリダクション演算の結果として中間計算において発生することがあります。関数が,これら両方のケ,スで正しく動作することを確認してください。関数がこれらのケースを正しく処理しない兆候の 1 つは、"出力のサイズが異なります" のエラー メッセージを受信する場合です。
matlab.tall.blockMovingWindow
|matlab.tall.movingWindow
|matlab.tall.reduce
|matlab.tall.transform