主要内容

このペ,ジの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

カスタム高配列アルゴリズムの開発

高大配列は,MATLAB従来の®構文を使用して大規模なデ,タセットを扱うための強力で直感的な方法です。ただし,高配列は,それぞれが個別にメモリに収まるデータ ブロックを操作するため、ほとんどの関数の従来のアルゴリズムは、tall 配列をサポートするために並列化アプローチを使用するよう更新しなければなりません。このトピックでは、tall 配列を操作するための独自の並列化アルゴリズムの開発方法を説明します。

カスタム関数を高配列に適用するために現在使用できるアプロ,チは,次のとおりです。

どの操作を選択するかに関わりなく,すべてのアプローチに適用されるオプション,パフォーマンス上の考慮事項,および一般的な問題があります。

カスタムアルゴリズムを実装する理由

ほとんどの一般的な数学関数とMATLAB演算では,既にtall配列がサポ,トされています。機能が既にサポ,トされている場合は,独自のアルゴリズムを作成する必要はないかもしれません。

以下に,高配列用のカスタムアルゴリズムを実装することが望ましい理由をいくか示します。

  • 現在サポ,トされていない関数の実装——特定の関数が現在高配列をサポートしていない場合は,ここで概説するAPIを使用して,高配列をサポートするその関数のバージョンを作成できます。

  • 既存のコ,ドの活用——インメモリデータに対していくつかの操作を実行する既存のコードがある場合は,わずかな変更だけで,高配列を扱うように互換性をもたせることができます。このアプローチでは,高配列をサポートするMATLAB言語のサブセットに合わせてコードを変換する必要がありません。

  • パフォ,マンスの向上——たとえば,MATLAB関数をc++墨西哥人関数として書き換えることができ,ここで概説するAPIを使用して,データを扱う墨西哥人関数を呼び出すことができます。

  • 優先外部ラ@ @ブラリの使用——組織内での互換性のために,特定の外部ライブラリを特定の計算に使用するよう求められる場合があります。ここで概説するAPIを使用して,これらの外部ラaaplブラリの関数を再実装することができます。

サポ,トされているAPI

サポ,トされている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によって配列のブロックを操作したときの動作を示しています。

操作

説明

変換-各ブロックの行数は同じままですが、値が変わります。

  • A = matlab.tall。变换(@sin tX)は各ブロックの要素の正弦を計算する。

  • A = matlab.tall.transform(@(X) X ^2, tX)は各ブロックの要素を二乗する。

フィルタ,処理-各ブロックの行数が減少します。そのため,新しい配列内のブロックには前に他のブロックにあった行が含まれる可能性があります。

  • A = matlab.tall.transform(@(X) topkrows(X,5), tX)は各ブロックから上位5行のみを抽出し,他の行を除外する。

  • A = matlab.tall。变换(@sum tX)は各ブロックの要素の合計を計算し,そのため各ブロックはスカラ,に縮小される。一个の要素数はブロックの数と同じです。

変換構文

単一ステップの変換を適用する汎用構文は,次のとおりです。

[tA, tB, tC,…]= matlab.tall.transform(fcn, tX, tY, tZ, ...)

fcnの機能要件

fcnの一般的な関数シグネチャは,次のとおりです。

[a, b, c,…]= fcn(x, y, z, ...)
fcnは以下の要件を満たさなければなりません。

  1. 入力引数-入力[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,…]は,その高配列内のすべてのデ,タで構成される。

  2. 出力引数-出力[a, b, c,…]はメモリに収まるブロックで,それぞれの出力[tA, tB, tC,…]に送信されます。出力[a, b, c,…]は以下の特性を満たします。

    • [a, b, c,…]はすべて,最初の次元が同じサ。

    • [a, b, c,…]はすべて,fcnの以前の呼び出しの結果とそれぞれ垂直方向に連結される。

    • [a, b, c,…]はすべて,それぞれの出力先で,出力配列の最初の次元にある同じesc escンデックスに送信される。

  3. 関数ル,ル- - - - - -fcnは関数ル,ルを満たさなければなりません。

    • F ([inputs1;inputs2) == [F(inputs1);F (inputs2)):入力の連結に関数を適用することは,入力に関数を個別に適用してから結果を連結する場合と同じでなければならない。

  4. 空の入力- - - - - -fcnが高さ0の入力を処理できることを確認します。空の入力は,ファイルが空の場合や、データに対して数多くのフィルター処理を行った場合に発生することがあります。

2ステップのリダクション演算

matlab.tall.reduceは2つの関数を高配列に適用し,最初のステップの結果を最後のリダクションステップに入力として送ります。リダクション関数は,メモリに収まる単一の最終ブロックが得られるまで,中間結果に繰り返し適用されます。MapReduceのパラダイムでは,この処理は”単一キー”のMapReduce演算に似ています。そこでは,中間結果がすべて同じキ,をも,リダクションステップで結合されます。

最初のステップはmatlab.tall.transformに似ており,その要件は同じです。ただし,リダクション ステップでは、中間結果がメモリに収まる単一のブロックへと常に縮小されます。以下の図は、matlab.tall.reduceによって配列のブロックを操作したときの動作を示しています。

操作

説明

変換+リダクション——各ブロックの行数は最初のステップの後も同じままで,その後,中間結果が1つのブロックに縮小されます。

  • A = matlab.tall.reduce(@sin,@max,tX)は各ブロックの値の正弦を計算したうえで,リダクションステップの間に全体の最大値を見ける。

  • A = matlab.tall.reduce(@(X) X ^2, @mean, tX)は各ブロックの要素を二乗したうえで,リダクションステップで全体の平均を計算する。

フィルタ,処理+リダクション-最初のステップで、各ブロックの行数が減らされます。その後,中間結果が1ブロックへと縮小されます。

  • A = matlab.tall。reduce(@sum, @sum, tX)は各ブロックの要素の合計を計算したうえで,リダクションステップで要素全体の合計数を求める。

  • A = matlab.tall.reduce(@(X) X(X>0), @mean, tX)は負の値をすべて除外したうえで,残りの値全体の平均を計算する。

减少の構文

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,…]に分割されます。その後,fcnreducefcnへの入力である出力[a, b, c,…]を返します。最後に,reducefcnは,matlab.tall.reduceによって返される最終的な結果[rA, rB, rC]を返します。

reducefcnの機能要件

fcnの要件は,FCNの機能要件で概説したものと同じです。ただし,reducefcnの要件は異なります。

reducefcnの一般的な関数シグネチャは,次のとおりです。

[rA, rB, rC,…]= reducefcn(a, b, c, ...)
reducefcnは以下の要件を満たさなければなりません。

  1. 入力引数-入力[a, b, c,…]はメモリに収まるブロックです。デ,タのブロックは,fcnによって返される出力か,さらなる縮小のために再度処理される,ある程度縮小されたreducefcnからの出力のいずれかです。入力[a, b, c,…]は次の特性を満たします。

    • 入力[a, b, c,…]は,最初の次元が同じサ。

    • 最初の次元の特定▪▪ンデックスに▪▪いて,デ▪▪タ[a, b, c,…]のブロックの各行は入力から派生するか,またはreducefcnに対する以前の同じ呼び出しから派生する。

    • 最初の次元の特定▪▪ンデックスに▪▪いて,その▪▪ンデックスの入力[a, b, c,…]の各行は,最初の次元の同じ。

  2. 出力引数-すべての出力[rA, rB, rC,…]は,最初の次元が同じサ。さらに,必要に応じて縮小を繰り返すことができるように,それぞれの入力[a, b, c,…]と垂直方向に結合可能でなければなりません。

  3. 関数ル,ル- - - - - -reducefcnは,以下の関数ル,ルを満たさなければなりません(丸め誤差を含む)。

    • F(input) == F(F(input)):同じ入力に繰り返し関数を適用しても,結果が変わってはならない。

    • F ([input1;input2) == F([input2;input1]):結果が,連結の順序に依存することがあってはならない。

    • F ([input1;input2) == F([F(input1);F (input2)]):いくつかの中間結果の連結に関数を1回適用することは,それを別々に適用し,連結し,再び適用することと同じでなければならない。

  4. 空の入力- - - - - -reducefcnが高さ0の入力を処理できることを確認します。空の入力は,ファイルが空の場合や、データに対して数多くのフィルター処理を行った場合に発生することがあります。この呼び出しでは、すべての入力ブロックは、最初の次元以外で正しい型とサイズをもつ空の配列となります。

スラ@ @ディングウィンドウ操作

関数matlab.tall.movingWindowおよびmatlab.tall.blockMovingWindowは,高配列内のデ,タのウィンドウに関数を適用します。matlab.tall.transformmatlab.tall.reduceは一度にデータブロック全体に対して操作を行いますが,移動ウィンドウ関数は,ウィンドウが配列の先頭から末尾まで移動する際にデータのウインドウに対して操作を行います。ウィンドウは,ディスクから読み取られるデ,タの複数のブロックにまたがることができます。

以下の図は,matlab.tall.movingWindowまたはmatlab.tall.blockMovingWindowによって配列のブロックを操作したときの動作を示しています。

操作 説明

ウィンドウ変換-各ブロックの行数は同じままですが、値が変わります。出力は,不完全なデータ ウィンドウと完全なデータ ウインドウの両方に対して実行された操作の結果を含みます。

matlab.tall.movingWindowmatlab.tall.blockMovingWindowはどらも,“端点”“缩水”の既定値であるか,埋め込み値が指定されている場合にデ,タを変換します。両方の値により,出力と入力の最初の次元が確実に同じサ。

  • A = matlab.tall。movingWindow(@mean, 100, tX)は,100のウィンドウサ显卡ズを使用して移動平均を計算します。

ウィンドウフィルタ,処理—不完全なデタウィンドウが破棄されるため,出力の要素数は入力より少なくなります。出力は,完全なデ,タウィンドウに対して行った操作の結果のみを含みます。

matlab.tall.movingWindowmatlab.tall.blockMovingWindowはどらも“端点”“丢弃”の場合に不完全なデ,タウィンドウを削除します。

  • A = matlab.tall。movingWindow(@mean, 100, tX, 'EndPoints', 'discard')は,100のウィンドウサズを使用して完全なデタウィンドウの移動平均を計算します。

matlab.tall.movingWindowmatlab.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, ...)

入力信息は,窗口およびフィ,ルドを含む構造体です。関数を作成するときに、これらのフィールドを使用して各ブロックからデータのウィンドウを選択します。

fcnwindowfcn,およびblockfcnが従わなければならない一般規則の概要にいては,FCNの機能要件を参照してください。入力信息を除けば,fcnwindowfcnの要件は同じです。しかし,関数blockfcnはデ,タブロック全体に対して操作を行うため,要件が異なります。

windowfcnの機能要件

windowfcnの一般的な関数シグネチャは,次のとおりです。

[a, b, c,…]= windowfcn(info, x, y, ...)
入力信息は,matlab.tall.blockMovingWindowによって提供される構造体で,以下のフィ,ルドを含みます。

  • —ウィンドウ間の指定ステップサaapl . aapl .ズ(既定の設定:1)。この値は名前と値のペア“步”で設定します。

  • 窗口-指定のウィンドウサie浏览器ズ。この値は窗口入力引数で設定します。

windowfcnは以下の要件を満たさなければなりません。

  1. 入力引数-入力[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を適用することで,その各列または各変数における入力デ,タが削減されなければなりません。

  2. 出力引数-出力[a, b, c,…]はメモリに収まるブロックで,それぞれの出力[tA, tB, tC,…]に送信されます。出力[a, b, c,…]は以下の特性を満たします。

    • 出力[a, b, c,…]はすべて,最初の次元が同じサ。

    • 出力[a, b, c,…]はすべて,windowfcnの以前の呼び出しの結果とそれぞれ垂直方向に連結される。

    • 出力[a, b, c,…]はすべて,それぞれの出力先で,出力配列の最初の次元にある同じesc escンデックスに送信される。

  3. 関数ル,ル- - - - - -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.blockMovingWindowblockfcnに提供するデ,タブロックbX, bY, bZ,…には次の特性があります。

  • ブロックにはフルサ@ @ズのウィンドウのみが含まれる。blockfcnは不完全なデ,タウィンドウに対する動作を定義する必要はありません。

  • 最初のデ,タウィンドウは,ブロックの最初の要素から開始する。最後のウィンドウの最後の要素は,ブロックの最後の要素です。

blockfcnは以下の要件を満たさなければなりません。

  1. 入力引数-入力[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を適用した結果,入力デ,タはその各列または各変数において削減されなければなりません。

  2. 出力引数-出力[a, b, c,…]はメモリに収まるブロックで,それぞれの出力[tA, tB, tC,…]に送信されます。出力[a, b, c,…]は以下の特性を満たします。

    • 出力[a, b, c,…]はすべて,最初の次元が同じサ。

    • 出力[a, b, c,…]はすべて,blockfcnの以前の呼び出しの結果とそれぞれ垂直方向に連結される。

    • 出力[a, b, c,…]はすべて,それぞれの出力先で,出力配列の最初の次元にある同じesc escンデックスに送信される。

  3. 関数ル,ル- - - - - -blockfcnは以下の関数ル,ルを満たしていなければなりません。

    • F ([inputs1;inputs2) == [F(inputs1);F (inputs2)):入力の連結に関数を適用することは,入力に関数を個別に適用してから結果を連結する場合と同じでなければならない。

出力デ,タ型の制御

サポ,トされているAPIのいずれかからの最終的な出力に入力と異なるデ,タ型がある場合は,名前と値のペア“OutputsLike”を指定して,対応する出力と同じデタ型と属性をも1以上のプロトタプ配列を提示“しなければなりません”。“OutputsLike”の値は常に细胞配列であり,各细胞には対応する出力引数のプロトタイプ配列が含まれます。

たとえば,次のmatlab.tall.transformの呼び出しは,1の高配列tXを入力として受け取り,プロトタprotoAおよびprotoBによって指定された異なる型をも2の出力を返します。出力一个protoAと同じデタ型と属性をも,BprotoBの場合も同様です。

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 つは、"出力のサイズが異なります" のエラー メッセージを受信する場合です。

参考

|||

関連するトピック