# ストリーミングの実行

ストリーミングの実行によって、無数のデータを処理できるようになります。ストリーミングを実行しない場合、変換が実行される前に変換の入力全体がメモリに格納されます。そのため、送信されるデータの量が利用可能なメモリに収まる量に制限されます。500MB以上の入力ファイルに対してストリーミング実行を無効にすると、エラーが発生します。

このドキュメンテーションは、tHMapコンポーネントとcMapコンポーネントにのみ適用されます。Spark Batchコンポーネント(tHMapFileやtHMapInputなど)の場合は、ストリーミング実行を有効にする必要はありません。

## コンポーネントの設定

* 大型のファイルを処理するtFileInputRawのようなコンポーネントでは、[Basic settings] (基本設定)ビューで[Stream the file] (ファイルをストリーム)パラメーターを選択する必要があります。これにより、入力ファイル全体をメモリにあるStringやバイト配列に読み込む必要がなくなります: ![tFileInputRawの\[Basic settings\] (基本設定)ビュー。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-streaming_tFileInputRaw.png)
* tHMapの場合は、常にtFileOutputRawを併用する必要があります。tHMapを使用する場合は、[Basic settings] (基本設定)ビューで[InputStream (single column)] (InputStream (単一カラム))パラメーターを選択する必要があります。これによって出力全体をメモリに保存する必要がなくなり、tHMapによってすべての出力が生成されるのを待つことなく、tFileOutputRawが書き込みを開始するようになります: ![tHMapの\[Basic settings\] (基本設定)ビュー。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-streaming_tHMap.png)

## ストリーミング実行の仕組み

tHMapのストリーミングは、入力データのブロックを集積し、各ブロックを個別に変換を実行することで動作します。

SimpleLoopファンクションで[Stream Input] (入力をストリーム)プロパティをチェックし、変換がストリームするよう指定します: ![\[Expression SimpleLoop Properties\] (式のSimpleLoopのプロパティ)ダイアログボックス。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-streaming_tHMap-map.png)

そうすることで、1000番目のルーピングエレメントごとに、または各ブロックで変換(xQueryとDSQLのいずれか)が実行されます。デフォルトでは、ブロックカウントは1000です。この動作は、transform\_streaming\_block\_countというコンテキスト変数を使い、正の数値を追加すれば変更できます: ![ジョブの\[Context\] (コンテキスト)ビュー。](https://help.qlik.com/talend/ja-JP/data-mapper-user-guide/Resources/images/tdm-streaming_block-count.png)

## 制限事項

また、[Stream Input] (入力をストリーム)プロパティを選択する時は以下の情報が重要となります:

* マップで[Stream Input] (入力をストリーム)プロパティを有効にできるのは、1つのSimpleLoopファンクションのみです。複数のファンクションを有効にした場合、最上位のものだけが考慮され、他は無視されます。
* [Stream Input] (入力をストリーム)プロパティを有効にするルーピングエレメントには、ルーピングする兄弟エレメントがあってはなりません。これは、ルーピングするエレメントの祖先にも適用されます。したがって、複数の出力を持つマップはストリーミングできません。
* SimpleLoopファンクションで[Stream Input] (入力をストリーム)プロパティを選択するとソートキーが使用できません。ソートアクションはストリーミング中には実行できないためです。
* SimpleLoopファンクションで[Stream Input] (入力をストリーム)プロパティを選択し、さらに個別の子エレメントを選択すると、入力が子エレメントによってソート済みとなり、さらにソートすることなく個別の計算を行えるようになります。

以下は、上記の情報を要約した出力の例です:

```
root
  |-row(0:*)              can stream
    |-a
    |-b(0:*)              can stream (if row does not stream)
      |-c
      |-d(0:*)            cannot stream (has sibling loop h)
        |-e
        |-f(0:*)          cannot stream (parent d has sibling loop h)
          |-g(0:*)        cannot stream (grand parent d has sibling loop h)
      |-h(0:0)            cannot stream (has sibling loop d)
```