(57)【要約】  プロセッサとメモリとを含んで、プロセッサがクエリ定義を受けて付けてクエリグラフに変換し、クエリグラフを構成するオペレータの実行順序を決定したクエリ実行制御情報を生成し、入力バッファと、出力バッファと、保存数増減情報を含む演算スレッドを生成し、オペレータ毎にタプルを格納可能な一時保存領域をメモリに設定し、プロセッサがクエリ実行制御情報により演算スレッドを実行し、オペレータの処理が完了するたびに、一時保存領域と入力バッファまたは出力バッファとの間で入出力されたタプルの増減数をタプル毎に保存数増減情報に格納し、演算スレッドでクエリグラフを構成する最後のオペレータの処理を完了した後に、タプル毎に保存数増減情報の総和を演算し、前記総和と所定の閾値から不要になったタプルを特定し、前記特定されたタプルの領域を回収する。
2016035189.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサとメモリを含む計算機で、受信したタプルをクエリで処理するストリームデータ処理方法であって、
前記計算機が、クエリ定義を受けて付けてクエリグラフに変換し、前記クエリグラフを構成するオペレータの実行順序を決定したクエリ実行制御情報を生成する第１のステップと、
前記計算機が、前記タプルを格納する入力バッファと、前記オペレータの処理結果として結果タプルを格納する出力バッファと、前記タプルの増減数を格納する保存数増減情報を含む演算スレッドを生成して前記プロセッサに割り当てる第２のステップと、
前記計算機が、前記オペレータ毎に前記タプルを一時的に格納可能な一時保存領域を前記メモリに設定する第３のステップと、
前記計算機が、前記タプルを受け付けて前記クエリ実行制御情報により前記演算スレッドを実行し、前記演算スレッドは前記オペレータの処理が完了するたびに、前記一時保存領域と前記入力バッファまたは出力バッファとの間で入出力された前記タプルの増減数を当該タプル毎に前記保存数増減情報に格納する第４のステップと、
前記計算機が、演算スレッドで前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記タプル毎に保存数増減情報の総和を演算し、前記総和と所定の閾値から不要になったタプルを特定する参照数一括更新処理を実行する第５のステップと、
前記計算機が、前記特定されたタプルの領域を回収する第６のステップと、
を含むことを特徴とするストリームデータ処理方法。
【請求項２】
請求項１に記載のストリームデータ処理方法であって、
前記第１のステップは、
前記クエリ実行制御情報に含まれる前記クエリグラフを構成するオペレータのうち最後のオペレータの後に、前記参照数一括更新処理を付加し、
前記第５のステップは、
前記演算スレッドが、前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記参照数一括更新処理を実行することを特徴とするストリームデータ処理方法。
【請求項３】
請求項１に記載のストリームデータ処理方法であって、
前記第２のステップは、
前記参照数一括更新処理を実行する独立した更新専用スレッドを生成して前記プロセッサに割り当てるステップを含み、
前記第５のステップは、
前記演算スレッドが、前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記更新専用スレッドを実行させることを特徴とするストリームデータ処理方法。
【請求項４】
請求項１に記載のストリームデータ処理方法であって、
前記プロセッサは複数のプロセッサを含み、
前記第２のステップは、
前記演算スレッドとして第１の演算スレッドと第２の演算スレッドを生成して前記プロセッサにそれぞれ割り当て、
前記第４のステップは、
前記第２の演算スレッドは、前記第１の演算スレッドと同一のオペレータの処理を実行する際には、前記第１の演算スレッドで前記同一のオペレータの処理が完了するまで待機した後に、当該第２の演算スレッドで前記同一のオペレータの実行を開始することを特徴とするストリームデータ処理方法。
【請求項５】
プロセッサとメモリとを含んで、受信したタプルをクエリで処理するストリームデータ処理装置であって、
前記プロセッサが、クエリ定義を受けて付けてクエリグラフに変換し、前記クエリグラフを構成するオペレータの実行順序を決定したクエリ実行制御情報を生成し、前記タプルを格納する入力バッファと、前記オペレータの処理結果として結果タプルを格納する出力バッファと、前記タプルの増減数を格納する保存数増減情報を含む演算スレッドを生成し、前記オペレータ毎に前記タプルを一時的に格納可能な一時保存領域を前記メモリに設定し、
前記プロセッサが、前記クエリ実行制御情報により前記演算スレッドを実行し、前記オペレータの処理が完了するたびに、前記一時保存領域と前記入力バッファまたは出力バッファとの間で入出力された前記タプルの増減数を当該タプル毎に前記保存数増減情報に格納し、
前記プロセッサが、演算スレッドで前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記タプル毎に保存数増減情報の総和を演算し、前記総和と所定の閾値から不要になったタプルを特定する参照数一括更新処理を実行し、
前記プロセッサが、前記特定されたタプルの領域を回収することを特徴とするストリームデータ処理装置。
【請求項６】
請求項５に記載のストリームデータ処理装置であって、
前記プロセッサは、前記クエリ実行制御情報に含まれる前記クエリグラフを構成するオペレータのうち最後のオペレータの後に、前記参照数一括更新処理を付加し、
前記プロセッサは、
前記演算スレッドが、前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記参照数一括更新処理を実行することを特徴とするストリームデータ処理装置。
【請求項７】
請求項５に記載のストリームデータ処理装置であって、
前記プロセッサは、前記参照数一括更新処理を実行する独立した更新専用スレッドを生成し、
前記プロセッサは、前記演算スレッドが、前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記更新専用スレッドを実行させることを特徴とするストリームデータ処理装置。
【請求項８】
請求項５に記載のストリームデータ処理装置であって、
前記プロセッサは複数のプロセッサを含み、
前記プロセッサは、前記演算スレッドとして第１の演算スレッドと第２の演算スレッドを生成して前記複数のプロセッサでそれぞれ実行し、
前記第２の演算スレッドでは、前記プロセッサは、前記第１の演算スレッドと同一のオペレータの処理を実行する際には、前記第１の演算スレッドで前記同一のオペレータの処理が完了するまで待機した後に、当該第２の演算スレッドで前記同一のオペレータの実行を開始することを特徴とするストリームデータ処理装置。
【請求項９】
プロセッサとメモリを含む計算機で、受信したタプルをクエリで処理するプログラムを格納した記憶媒体であって、
クエリ定義を受けて付けてクエリグラフに変換し、前記クエリグラフを構成するオペレータの実行順序を決定したクエリ実行制御情報を生成する第１の手順と、
タプルを格納する入力バッファと、前記オペレータの処理結果として結果タプルを格納する出力バッファと、前記タプルの増減数を格納する保存数増減情報を含む演算スレッドを生成して前記プロセッサに割り当てる第２の手順と、
前記オペレータ毎に前記タプルを一時的に格納可能な一時保存領域を前記メモリに設定する第３の手順と、
前記タプルを受け付けて前記クエリ実行制御情報により前記演算スレッドを実行し、前記演算スレッドは前記オペレータの処理が完了するたびに、前記一時保存領域と前記入力バッファまたは出力バッファとの間で入出力された前記タプルの増減数を当該タプル毎に前記保存数増減情報に格納する第４の手順と、
前記演算スレッドで前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記タプル毎に保存数増減情報の総和を演算し、前記総和と所定の閾値から不要になったタプルを特定する参照数一括更新処理を実行する第５の手順と、
前記特定されたタプルの領域を回収する第６の手順と、
を前記計算機に実行させるプログラムを格納した非一時的な計算機読み取り可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストリームデータ処理の性能を向上させる技術に関する。
【背景技術】
【０００２】
証券取引の自動化、交通情報処理の高度化、クリックストリームの解析といった、高いレートで継続的に発生する情報をリアルタイムに解析し、重要なイベントの発生に対して瞬時にアクションを起こす要求の高まりを背景に、高レートデータのリアルタイム処理を実現する、ストリームデータ処理が注目されている。【０００３】
ストリームデータ処理は、様々なデータ処理に適用可能な汎用ミドルウェア技術であるため、個別案件ごとにシステムを構築するのでは間に合わないようなビジネス環境の急激な変化にも応えつつ、実世界のデータをリアルタイムにビジネスに反映することを可能とする。【０００４】
ストリームデータ処理が対象とするストリームとは、タイムスタンプ付きのデータであるタプルが、連続して到来する時系列データである。ストリームデータ処理のユーザが、このストリームに対する監視ルールをクエリとして定義すると、クエリ定義をクエリグラフに変換する。クエリグラフは、オペレータと呼ばれる処理単位をノードとし、同オペレータ間のタプルキューをエッジとする、有向グラフである。入力ストリームを構成する個々のタプルについて、クエリグラフを通過させることで、データフロー的に処理を進める。データフロー型の処理であるため、クエリグラフを多段分割し、複数の計算資源によってパイプライン的に並列処理することで、スループット向上が可能である。【０００５】
近年の計算機では、複数のＣＰＵコア（またはプロセッサコア）を備えたマルチコアプロセッサが使用され、複数のスレッドを並列して実行する。ストリームデータ処理をマルチコアプロセッサで処理することで、高いスループットを得る技術として特許文献１が知られている。【０００６】
特許文献１では、クエリ定義をクエリグラフに変換してオペレータ間の実行順序を決定するクエリパーサを備え、かつ複数のクエリ実行スレッドを備えてストリーム処理を実行する。実行順序では連続するオペレータの集合をステージと呼び、各ステージを構成するオペレータの計算コストの合計を、当該ステージの計算コストと呼ぶ。そして、クエリパーサは、各ステージの計算コストが、全オペレータの合計コストをＣＰＵコア数で割った値よりも小さな値となるように、クエリグラフを複数のステージに分割する。各ＣＰＵコアは、入力ストリームから一つずつタプルを取り出して、クエリグラフの入口から出口まで当該タプルの処理を担当して実行する際に、各ステージの実行に先立って、処理を担当するタプルの一つ前のタプルについて当該ステージの処理が完了しているか否かを判定している。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】国際公開第２０１４／０４１６７３号
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記従来例では、ひとつのタプルが複数のＣＰＵコアで利用され、各ＣＰＵコアに割り当てられたタプル入出力バッファ、および全ＣＰＵコアが共有するオペレータ実行状態保持領域にタプルが格納される。各ＣＰＵコアは、あるオペレータの処理を完了すると、当該オペレータで不要になったタプル、およびタプル入力バッファのタプルを破棄する。いずれのオペレータでも利用されないタプルは、ストリームデータ処理部によってメモリ上から消去され、ストリームデータ処理部は、消去された領域を新たなタプルを格納する領域として回収する。【０００９】
上記タプルを管理する場合、例えば、タプル毎に各オペレータの保持領域への出し入れをカウントするカウンタを用い、カウンタの値が０になったタプルを回収することができる。この例では、カウンタが複数のＣＰＵコアからアクセスされるため、ひとつのＣＰＵコアがカウンタをアクセスしている間は、他のＣＰＵコアのアクセスを禁止する排他制御を行う必要がある。【００１０】
この排他制御により、複数のＣＰＵコアがカウンタにアクセスしようとすると、ひとつのＣＰＵコアのみがアクセスを許可され、他のＣＰＵコアは待機させられる。待機させられたＣＰＵコアでは、オペレータ等の処理が遅延してしまい、システムのスループットが低下するという問題があった。
【課題を解決するための手段】
【００１１】
本発明は、プロセッサとメモリを含む計算機で、受信したタプルをクエリで処理するストリームデータ処理方法であって、前記計算機が、クエリ定義を受けて付けてクエリグラフに変換し、前記クエリグラフを構成するオペレータの実行順序を決定したクエリ実行制御情報を生成する第１のステップと、前記計算機が、前記タプルを格納する入力バッファと、前記オペレータの処理結果として結果タプルを格納する出力バッファと、前記タプルの増減数を格納する保存数増減情報を含む演算スレッドを生成して前記プロセッサに割り当てる第２のステップと、前記計算機が、前記オペレータ毎に前記タプルを一時的に格納可能な一時保存領域を前記メモリに設定する第３のステップと、前記計算機が、前記タプルを受け付けて前記クエリ実行制御情報により前記演算スレッドを実行し、前記演算スレッドは前記オペレータの処理が完了するたびに、前記一時保存領域と前記入力バッファまたは出力バッファとの間で入出力された前記タプルの増減数を当該タプル毎に前記保存数増減情報に格納する第４のステップと、前記計算機が、演算スレッドで前記クエリグラフを構成する最後のオペレータの処理を完了した後に、前記タプル毎に保存数増減情報の総和を演算し、前記総和と所定の閾値から不要になったタプルを特定する参照数一括更新処理を実行する第５のステップと、前記計算機が、前記特定されたタプルの領域を回収する第６のステップと、を含む。
【発明の効果】
【００１２】
本発明によれば、タプルを管理する情報をロックすることなく、複数のプロセッサによるストリームデータ処理のスループットを向上させることができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施例を示し、ストリームデータ処理を行う計算機システムの一例を示すブロック図である。
【図２Ａ】本発明の実施例を示し、クエリ実行スレッドの一例を示すブロック図である。
【図２Ｂ】本発明の実施例を示し、オペレータ実行状態保持領域の一例を示すブロック図である。
【図２Ｃ】本発明の実施例を示し、タプルプールの一例を示すブロック図である。
【図３Ａ】本発明の実施例を示し、クエリ実行スレッドの一例を示すブロック図である。
【図３Ｂ】本発明の実施例を示し、タプルプールと参照カウンタの関係の一例を示す図である。
【図４】本発明の実施例を示し、ストリームデータ処理の一例を示すブロック図である。
【図５Ａ】本発明の実施例を示し、クエリグラフの一例を示す図である。
【図５Ｂ】本発明の実施例を示し、クエリグラフを分割したステージと処理時間の関係の一例を示す図である。
【図５Ｃ】本発明の実施例を示し、各図で行われるステージの処理と時間の関係を示すタイムチャートである。
【図６Ａ】本発明の実施例を示し、各図で行われるクエリ実行処理の一例を示すフローチャートの前半部である。
【図６Ｂ】本発明の実施例を示し、各図で行われるクエリ実行処理の一例を示すフローチャートの後半部である。
【図７】本発明の実施例を示し、参照カウンタ一括更新処理の一例を示すフローチャートである。
【図８】本発明の実施例を示し、ストリームデータ処理部が出力する画面イメージの一例である。
【図９】本発明の実施例を示し、参照カウンタの一括更新によりストリームデータ処理を行う例を示すブロック図である。
【図１０】本発明の実施例を示し、コピーによりストリームデータ処理を行う例を示すブロック図である。
【図１１】本発明の実施例を示し、ストリームデータ処理のスループットとコア数の関係を示すグラフである。
【図１２】本発明の実施例を示し、各コアで行われるステージの処理と時間の関係の他の例を示すタイムチャートである。
【発明を実施するための形態】
【００１４】
以下、本発明の一実施形態について添付図面を用いて説明する。
【００１５】
図１は、ストリームデータ処理を行う計算機システムの一例を示すブロック図である。ストリームデータ処理サーバ１００は、ＣＰＵコア９−１〜９−４を含むＣＰＵ９０と、データやプログラムを保持するメモリ１０３と、ネットワーク１５０に接続されたネットワークインタフェース１０５と、データやプログラムを格納するストレージ１０６と、これらの計算機資源を接続する１０４を含む計算機である。
【００１６】
メモリ１０３には、ストリームデータ処理を定義するストリームデータ処理部１１０が配置される。ストリームデータ処理部１１０は、ＣＰＵコア（または演算コア）９−１〜９−４によって実行可能な実行イメージである。なお、ＣＰＵコア９−１〜９−４の総称を“−”のない符号９で表す。他の構成要素についても同様であり、個々の構成要素を−１〜−ｎで表し、構成要素全体を“−”のない符号で表すものとする。
【００１７】
ストリームデータ処理サーバ１００は、ネットワークインタフェース１０５を介してネットワーク１５０に接続される。ネットワーク１５０に接続されたホスト計算機１３０は、クエリ登録コマンド実行インタフェース１３１を介して、ユーザによって定義されたストリームクエリ１３２を、ストリームデータ処理サーバ１００に送信する。なお、ホスト計算機１３０は入出力装置１３３によって、ユーザからの入力を受け付け、ストリームデータ処理サーバ１００等からの出力を表示する。ホスト計算機１３０からストリームクエリ１３２を受信したストリームデータ処理サーバ１００は、ストリームデータ処理部１１０で、受信したクエリ定義（ストリームクエリ１３２）に従ってストリームデータ処理を実行可能なクエリグラフを構築する。
【００１８】
ストリームデータ処理サーバ１００は、ネットワーク１５０に接続されたデータ発生器１２０から送信されるタプル１２１を受信する。なお、タプル１２１は、タイムスタンプが付与されたデータである。ストリームデータ処理サーバ１００は、受信したタプルを前記クエリグラフに従って処理し、結果タプル１４１を生成する。ストリームデータ処理サーバ１００は、この結果タプル１４１を、ネットワーク１５０に接続されたデータ受信機１４０に送信する。
【００１９】
ストリームデータ処理サーバ１００のストレージ１０６は、ストリームデータ処理部１１０の実行イメージの他、一度受け取った前記ストリームクエリ１３２のテキストファイルを保存する。ストリームデータ処理部１１０は、起動時にストレージ１０６からこのクエリのファイルをロードし、クエリグラフを構築することも可能である。
【００２０】
ストリームデータ処理部１１０等の各機能部はプログラムとしてメモリ１０３にロードされる。ＣＰＵ９０は、各機能部のプログラムに従って処理することによって、所定の機能を提供する機能部として稼働する。例えば、ＣＰＵ９０は、ストリームデータ処理プログラムに従って処理することでストリームデータ処理部１１０として機能する。他のプログラムについても同様である。さらに、ＣＰＵ９０は、各プログラムが実行する複数の処理のそれぞれの機能を提供する機能部としても稼働する。計算機及び計算機システムは、これらの機能部を含む装置及びシステムである。
【００２１】
ストリームデータ処理部１１０の各機能を実現するプログラム、テーブル等の情報は、ストレージ１０６や不揮発性半導体メモリ、ハードディスクドライブ、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記憶デバイス、または、ＩＣカード、ＳＤカード、ＤＶＤ等の計算機読み取り可能な非一時的データ記憶媒体に格納することができる。
【００２２】
図４、図２Ａ〜図２Ｃを用いて、ストリームデータ処理部１１０の論理構成を説明する。
【００２３】
図４は、ストリームデータ処理の一例を示すブロック図である。
【００２４】
ホスト計算機１３０のユーザがストリームクエリ１３２の登録操作を実行すると、クエリパーサ４０２が、ストリームクエリ１３２をクエリグラフ構成情報４０３に変換する。オペレータ実行順序決定部４０４は、クエリグラフ構成情報４０３を処理して、クエリグラフを構成するオペレータ間の実行順序を決定し、オペレータ実行順情報４０５として出力する。このオペレータ間の実行順序を決定する処理は、公知または周知の技術を用いることができ、例えば、特開２０１０−１０８１５２号公報の技術を適用すれば良い。
【００２５】
オペレータ処理コスト算出部４０６は、該クエリグラフにおける各オペレータの処理時間の見積り結果を計算コストとして算出する。参照カウンタ一括更新コスト算出部４０７は、該クエリグラフの最後に付加する参照カウンタ３００の一括更新処理の処理時間の見積り結果を計算コストとして算出する。参照カウンタ一括更新コスト算出部４０７は処理時間の見積りを特許文献１に記載されたオペレータ処理コスト算出部４０６と同様に行えば良い。
【００２６】
オペレータ処理コスト算出部４０６の計算コストと、参照カウンタ一括更新コスト算出部４０７の計算コストをステージ分割決定部４０８に入力する。ステージ分割決定部４０８は、前記クエリグラフと参照カウンタ一括更新処理５１１を複数のステージに分割する。オペレータ処理コスト算出部４０６とステージ分割決定部４０８は前記特許文献１と同様である。
【００２７】
ここで、ステージとは、前記クエリグラフを構成するオペレータ間の実行順序において、連続する一つ以上のオペレータの集合を指す。本実施例では、ステージをひとつの処理単位として扱い、各ＣＰＵコア９がひとつのステージ単位で処理を実行する。
【００２８】
ストリームデータ処理サーバ１００は、該クエリグラフにステージの分割結果を付与し、最終的にクエリ実行制御情報４０９を生成する。クエリ実行制御情報４０９は、ＣＰＵコア９の数に応じてクエリ実行スレッド２００を生成し、ＣＰＵコア９に割り当てる。
【００２９】
本実施例では、ステージＡ、Ｂ、Ｃ、Ｄ、およびＥのそれぞれが、図５Ａで示すように、オペレータ（ＯＰ）１〜オペレータ（ＯＰ）１０で構成されている。ステージの分割方法については、前記特許文献１と同様にして行うことができるので、ここでは詳述しない。なお、図示の例では、ステージＡ（５２１）がオペレータ１（５０１）、２（５０２）を含み、ステージＢ（５２２）がオペレータ３（５０３）、４（５０４）、５（５０５）を含み、ステージＣ（５２３）がオペレータ６（５０６）、７（５０７）を含み、ステージＤ（５２４）がオペレータ８（５０８）、９（５０９）を含み、ステージＥ（５２５）がオペレータ１０（５１０）と参照カウンタ一括更新（５１１）を含む例を示す。以上、クエリ実行制御情報４０９の生成までが、クエリ登録時にストリームデータ処理サーバ１００で行われる処理となる。
【００３０】
次に、クエリ実行時の処理を説明する。ストリームデータ処理サーバ１００がクエリを実行するときには、クエリ実行スレッド２００−１〜２００−４が、当該計算機環境における計算リソース数（ＣＰＵ９０のコア数）に併せて処理を開始する。本実施例では、４つのＣＰＵコア９−１〜９−４が利用可能である環境で、４つのクエリ実行スレッド２００−１〜２００−４を実行する例を示す。
【００３１】
本実施例でのストリームデータ処理は、ストリームデータ処理サーバ１００へ順次到来するタプルの一つ一つに対してデータ処理を実行するクエリ実行スレッド２００を一つずつバインドして並列に処理を実行する。つまり、複数のＣＰＵコア９のそれぞれが、各々分割されたステージＡ〜Ｅを順次実行し、一つのタプル１２１に関する処理を一つのＣＰＵコア９で完遂する。
【００３２】
このため、図４に示すタプル入力部４５０は、入力タプル１２１を受け付けると、個々のタプル１２１に、１ずつインクリメントする整数の連番を付与して、クエリ実行スレッド２００−１〜２００−４に渡す。クエリ実行スレッドのうち、実行休止中であるクエリ実行スレッド２００−ｎの一つが、前記タプル１２１を処理する。
【００３３】
例えば、タプル１２１に連番“８８”が付与され、クエリ実行スレッド２００−１がタプル１２１の処理を担当すると仮定する。クエリ実行スレッド２００−１は、この連番“８８”を、オペレータ実行状態保持領域２０４−１に保持する。なお、オペレータ実行状態保持領域２０４−１は、オペレータ１の実行状態を保持する領域である。また、タプル１２１の一つ前のタプル、すなわち連番“８７”のタプルの処理をクエリ実行スレッド２００−４が担当すると仮定する。
【００３４】
クエリ実行スレッド２００−１は、連番“８８”のタプルについて、ステージＡの処理から順に実行する。その実行に先立って、担当の連番“８８”のタプルの一つ前のタプル、すなわちクエリ実行スレッド２００−４が担当する連番“８７”のタプルについて、クエリ実行スレッド２００−１は、スレッド２００−４でステージＡの処理が完了しているか否かを判定する。
【００３５】
本実施例では、クエリ実行スレッド２００−１〜２００−４の各々は、自らが担当するタプル１２１の各ステージの処理実行が終了するごとに、クエリ実行状態保持領域４３０に設定された対応するステージの実行済みタプル連番フラグ（図示省略）の値を、担当するタプル（その当該ステージの実行が終了したタプル）の連番から、次の連番に書き換える。なお、この処理については前記特許文献１の技術を用いることができる。
【００３６】
クエリ実行スレッド２００−１は、自らが担当するタプルの連番“８８”と一致しない場合、すなわち一つ前の連番“８７”のタプルのステージＡの処理が完了していない場合には処理の開始を待機する。
【００３７】
クエリ実行スレッド２００−４は連番“８７”のタプルについてステージＡの処理（すなわち、オペレータ２の処理）を完了した段階で、連番の値に１を加算する。クエリ実行スレッド２００−１によるステージＡの実行に先立つ判定は、例えば一定周期で繰り返して行い、このフラグ値の変更を判定した段階で、連番“８８”についてのステージＡの処理を開始する。
【００３８】
このように、各クエリ実行スレッド２００−１〜２００−４が、各ステージの処理を開始する前に、直前のタプルについて、当該ステージの処理が完了しているか否かを、クエリ実行スレッド２００間で判定する。クエリ実行スレッド２００間での処理の完了判定は、公知または周知の技術を用いることができる。
【００３９】
各ステージＡ〜Ｅのオペレータ（ＯＰ１〜ＯＰ１０）の実行状態は、クエリ実行状態保持領域４３０上の、オペレータ実行状態保持領域２０４−１〜２０４−１０で管理し、全てのクエリ実行スレッド２００−１〜２００−１で共有する。オペレータ実行状態保持領域２０４−１〜２０４−１０は、各オペレータで利用するタプルの一時保存領域として機能する。
【００４０】
タプル入力部４５０は、登録されたタプルと、入力ストリームに付与された先頭のタプルのタイムスタンプを比較して、より過去の方から順に連番を付与して、クエリ実行スレッド２００−１〜２００−４に渡す。
【００４１】
クエリ実行スレッド２００では、それぞれ入出力されたタプルについてステージＡ〜Ｅの処理が順次開始され、並列的に処理が実行される。クエリ実行スレッド２００は、先行するタプル１２１の処理を追い越さないように各オペレータの処理を制御する。
【００４２】
クエリ実行スレッド２００は、タプルを処理する際にタプルプール２１０を管理するタプル用領域管理部２１１からタプルデータと参照カウンタ３００を格納するメモリ１０３上の領域２１２〜２１５を取得する。各オペレータは、メモリ１０３上の領域２１２〜２１５のポインタ（Ｐｎｔ．０〜Ｐｎｔ．３）を用いて演算を実行する。
【００４３】
また、Ｗｉｎｄｏｗ、Ｊｏｉｎ、ＧｒｏｕｐＢｙ等の実行状態を有するオペレータは、図２Ｂで示すように、タプル（またはタプルのポインタ）を格納するオペレータ実行状態保持領域２０４−１〜２０４−１０を有する。例えば、ステージＡのオペレータ１（ＯＰ１）は、タプルを一時的に格納するオペレータ実行状態保持領域２０４−１を有し、入力タプルや生成したタプルを保存することができる。
【００４４】
前記オペレータ実行状態保持領域２０４−１に格納されたタプルは、不要になった段階で破棄される。本実施例では、オペレータ実行状態保持領域２０４−１のタプルが不要であるか否かを判定するために、最後のステージＥで参照カウンタ一括更新の処理を実施し、参照カウンタ３００の値が所定の値になったタプルを破棄し、タプル用領域管理部２１１は、当該タプルに割り当てられた領域を回収する。
【００４５】
クエリ実行スレッド２００から出力されたタプルは、タプル出力部４５１から結果タプル１４１として出力される。ストリームデータ処理サーバ１００は、ネットワーク１５０を介してデータ受信機１４０に結果タプル１４１を送信する。
【００４６】
本実施例では、タプルについて一連の処理を行うクエリ実行スレッド２００が、最後のステージＥに、参照カウンタ一括更新の処理を含めることで、参照カウンタ３００の操作をひとつのＣＰＵコア９に限定することができる。これにより、参照カウンタ３００の排他制御（ロック）を不要にし、排他制御によるオーバーヘッドを低減するものである。
【００４７】
図２Ａは、クエリ実行スレッド２００−１の詳細を示すブロック図である。なお、クエリ実行スレッド２００−２〜２００−４も同様の構成である。クエリ実行スレッド２００−１は、入力タプルまたは入力タプルのポインタを格納するタプル入力バッファ２０１と、出力または生成されたタプルを格納するタプル出力バッファ２０２と、クエリ実行スレッド２００−１へ入出力されたタプルの増減を格納するタプル保存数増減リスト２０３と、を含んで上述のステージＡ〜Ｅを処理する。
【００４８】
すなわち、クエリ実行スレッド２００−１がステージＡの処理を実行した後、値を保持したステージＢの処理を実行する。このときステージＡを処理したときのタプル出力バッファ２０２は、値を保持したままステージＢのタプル入力バッファ２０１として機能する。また、タプル入力バッファ２０１に格納されたタプルのポインタは、当該オペレータの実行完了時に破棄される。
【００４９】
図中タプル入力バッファ２０１またはタプル出力バッファ２０２は、タプルが格納された領域のポインタ（Ｐｎｔ．０、Ｐｎｔ．３）と、各ポインタの状態を示す符号が“＋”または“−”で示される。符号“＋”は、当該ポインタのタプルの生存期間が開始されたことを示し、符号“−”は、当該ポインタのタプルの生存期間が終了されたことを示す。
【００５０】
タプル保存数増減リスト２０３は、各ステージのオペレータによるタプルの入出力に応じた、オペレータ実行状態保持領域および各ＣＰＵコアの入出力バッファでの保存数の増減値を、タプル毎に管理する。２０３の一行目は、オペレータ９の処理において、図示のポインタ（Ｐｎｔ．３）のタプルが生成され、タプル入力バッファ２０１に格納されたことを示す。２行目以降は、破棄（オペレータ１０の処理後のタプル入力バッファのクリア）、保存（オペレータ実行状態保持領域２０４−１０への格納）、保存（タプル出力バッファ２０２への格納）という順序でオペレータによる処理が行われた例を示す。また、同様に、図示のポインタ（Ｐｎｔ．０）のタプルでは、破棄（オペレータ実行状態保持領域２０４−１０からの削除）、保存（タプル出力バッファ２０２への格納）という順序でオペレータによる処理が行われた例を示す。
【００５１】
図２Ｂは、クエリ実行状態保持領域４３０に格納されるオペレータ実行状態保持領域２０４−１０を示す。図４で示すように、オペレータ１〜９のオペレータ実行状態保持領域２０４−１〜２０４−９も同様に構成される。なお、図中２０５は、オペレータ実行状態保持領域２０４−１０に保持されるタプルを格納する領域を示し、図中２０５の外側のタプル（Ｐｎｔ．０）は、オペレータ実行状態保持領域２０４−１０から破棄されるタプルを示す。
【００５２】
図２Ｃは、タプルプール２１０の一例を示すブロック図である。タプルプール２１０は、タプルにメモリ１０３の領域を割り当てるタプル用領域管理部２１１と、領域を割り当てたタプルが不要か否かを判定するための参照カウンタ３００とを保持する。
【００５３】
図中タプルの領域２１２は、ポインタＰｎｔ．０で参照され、参照カウンタ３００の値が“１”であることを示し、タプルの領域２１５は、値“ＤＤＤ”のタプルに割り当てられ、ポインタＰｎｔ．３で参照され、参照カウンタ３００の値が“０”であることを示している。そして、タプル用領域管理部２１１は、領域２１６、２１７を未割り当ての領域として確保している。
【００５４】
図３Ａ、図３Ｂは、図２Ａ、図２Ｃの次のステージに移行する前に、参照カウンタ一括更新の処理（５１１）を実行して、ポインタＰｎｔ．０のタプルを破棄し、タプルの領域２１２をタプル用領域管理部２１１が回収する例を示す。図３Ａは、例えば、図２Ａで前のステージを処理し、次のステージを開始する場合を示す。
【００５５】
クエリ実行スレッド２００−１は、タプル入力バッファ２０１は、図２Ａに示したタプル出力バッファ２０２であり、前のステージの処理で出力されたタプルを、次のステージの入力タプルとする例を示す。
【００５６】
図３Ｂは、例えば、図２ＡでステージＥを処理し、オペレータ１０（図５Ａ参照）の次に参照カウンタ一括更新処理（５１１）を行う例を示す。クエリ実行スレッド２００−１は、参照カウンタ一括更新処理（５１１）を実行して、タプル保存数増減リスト２０３のタプルのポインタ毎に総和を演算する。タプルプール２１０内のＰｎｔ．０の参照カウンタ３００の値は“０”となり、ポインタＰｎｔ．３の参照カウンタ３００の値は“１”となる。
【００５７】
参照カウンタ一括更新処理５１１では、当該処理を実行するクエリ実行スレッド２００が、タプル保存数増減リスト２０３をポインタまたはタプル毎に集計し、集計した値が“０”となったタプルが不要と判定する。そして、クエリ実行スレッド２００は、タプル用領域管理部２１１に、参照カウンタ３００の値が“０”となった領域２１２を未割り当ての領域として回収させる。
【００５８】
以上の処理により、タプル用領域管理部２１１がタプルに割り当てたメモリ１０３の領域は、クエリ実行スレッド２００がステージの最後で不要と判定すると、タプル用領域管理部２１１に回収され、新たなタプルを受け付ける領域として回復する。
【００５９】
＜ステージ分割決定部＞
次に、図５Ａ〜図５Ｃを用いて、ステージ分割決定部４０８におけるステージの分割方法を説明する。本実施例では、図４のクエリパーサ４０２が受け付けたストリームクエリ１３２を、図５Ａのオペレータ（ＯＰ）１〜オペレータ（ＯＰ）１０で示すクエリグラフ構成情報４０３に変換し、参照カウンタ一括更新処理を付加した例を用いる。
【００６０】
オペレータ（ＯＰ）１〜オペレータ（ＯＰ）１０＋参照カウンタ一括更新処理のクエリグラフについて、オペレータ実行順序決定部４０４が決定するオペレータの実行順序は、オペレータ１〜１０＋参照カウンタ一括更新処理５１１の順番になるとする。また、本実施例では４つのＣＰＵコア９でクエリを実行することを想定する。
【００６１】
オペレータ処理コスト算出部４０６が算出した、オペレータ１〜１０の計算コストの総計は９５となり、参照カウンタ一括更新コスト算出部４０７が算出した参照カウンタ一括更新の計算コストは５となり、計算コストの総和は１００となる。
【００６２】
ステージ分割決定部４０８は、まず、クエリグラフの全計算コスト（例えば、１００）を計算コア（ＣＰＵコア９）の数（例えば、４）で割った値である２５に対して、さらに所定のマージンをとった２２を、計算コストの閾値とする。
【００６３】
ステージ分割決定部４０８は、前記オペレータの実行順序に従って、オペレータの計算コストを順次加算していき、前記閾値（２２）を超えないようにステージを分割する。
【００６４】
本実施例では、オペレータ１〜２の計算コストの和が２１、ＯＰ１〜３の和が２４となるため、閾値の２２以下に収まるオペレータ１までを、最初のステージＡとする。以降、同様の分割ポリシを適用することで、ＯＰ３〜５、ＯＰ６〜７、ＯＰ８〜９、およびＯＰ１０＋参照カウンタ一括更新のステージＢ〜Ｅに分けられ、計５ステージ（５２１〜５２５）となる。
【００６５】
各ステージの計算コストは、それぞれステージＡ（５２１）が２１、ステージＢ（５２２）が１８、ステージＣ（５２３）が１８、ステージＤ（５２４）が２２、ステージＥ（５２５）が２１となる。１タプルの処理時間に対する、各ステージの処理時間の割合は図５Ｂの５３０に示すとおりである。なお、図５Ｂは、クエリグラフを分割したステージと計算コストの関係の一例を示す図である。
【００６６】
ここで、タプル処理時間の１／４の間隔で入力タプル１２１が到来するケースにおいて、図４に示した構成に従って処理した場合、各タプルは、各計算コアにおいて、図５Ｃのタイムチャート５３１に示すようなスケジュールで処理されることになる。なお、図５Ｃは、各ＣＰＵコア９で行われるステージの処理と時間の関係を示すタイムチャート５３１である。なお、図中コア０は図１のＣＰＵコア９−１を示し、コア１〜コア３はＣＰＵコア９−２〜９−４に対応する。
【００６７】
本実施例による処理では、入力タプル１２１が等間隔で順次到来する入力状態では、図５Ｃのタイムチャート５３１に示すとおり全く空白時間（処理待ちの時間）が発生しない。入力タプル１２１の到来が不等間隔になった場合には、処理待ちが発生する場合がある。
【００６８】
上記では、全計算コストをコア数の４で割った値２５に対して計算コストの閾値を２２とし、この閾値を超過しない範囲で順次オペレータを統合してステージを決定していた。入力タプル１２１の到来が不等間隔になったときの空白時間の発生は、この計算コストの閾値の大きさに依存する。
【００６９】
全計算コストをコア数で割った値に対するマージンをより大きくし、つまり計算コストの閾値をより小さな値として各計算コアに分担させるステージの分割を細かくし、一つのステージの計算時間を十分小さくとれば、タプルの到来時間がばらつくことによる空白時間の発生は回避可能である。
【００７０】
入力タプル１２１の到来時間のばらつきによる最短到来間隔が分かっていれば、その最短到来間隔よりも各計算コアが分担するステージの処理時間を短くすることで空白時間の発生を完全に回避できる。したがって、本実施例では、入力タプル１２１が等間隔で順次到来するという限られた条件下のみでなく、到来時間がばらついても、低レイテンシ化、高スループット化の効果が得られる。
【００７１】
そして、図５Ｃで示すように、タプル０〜４が入力されると、まず、コア０にタプル０が割り当てられてクエリ実行スレッド２００−１が開始される。クエリ実行スレッド２００−１は先行するクエリ実行スレッド２００がないので、各ステージＡ〜Ｅを順次実行する。
【００７２】
一方、タプル１が割り当てられたコア１は、上述したようにコア０がステージＡ０の処理が完了するのを待ってからステージＡ１の処理を開始する。他のコア２〜３も同様に、先行するクエリ実行スレッド２００がステージＡの処理を完了するのを待って、自クエリ実行スレッド２００のステージＡの処理を開始する。
【００７３】
したがって、本発明では、ある時刻で同一のステージを実行する他のコアはなく、各コア０〜３が異なるステージを順次並列的に処理する。したがって、参照カウンタ３００を更新するステージＥ０〜Ｅ４は、異なる時刻で順次行われることになる。タプルを管理する参照カウンタ３００をロックする必要がなくなって、複数のＣＰＵコア９によるストリームデータ処理のスループットを向上させることが可能となる。
【００７４】
なお、オペレータ１〜１０の計算コストや、参照カウンタ一括更新のコストは、予め設定した値を用いてもよい。
【００７５】
＜クエリ実行＞
図６Ａ、図６Ｂは、各ＣＰＵコア９で行われるクエリ実行処理の一例を示すフローチャートである。ストリームデータ処理サーバ１００は、入力タプル１２１を受信すると、各ＣＰＵコア９のクエリ実行スレッド２００に受信した入力タプル１２１を投入し、クエリ実行処理を開始させる。
【００７６】
まず、クエリ実行スレッド２００は、初回の処理でなければ、前段のオペレータで使用したタプル出力バッファ２０２を、次のオペレータで使用するタプル入力バッファ２０１とする（６００）。なお、初回の処理であれば、タプル出力バッファ２０２とタプル入力バッファ２０１の入れ替えは行わない。
【００７７】
クエリ実行スレッド２００は、ステップＳ６０１〜７０４の処理をタプル入力バッファ２０１のタプル毎に繰り返して実行する。まず、当該クエリ実行スレッド２００は、タプル保存数増減リスト２０３に、処理を行う入力タプル１２１のポインタを追加し、当該タプルの保存数の増減値を“−１”に設定する（６０２）。
【００７８】
次に、クエリ実行スレッド２００は、実行すべきオペレータ（ｗｉｎｄｏｗ、ｊｏｉｎ、ＧｒｏｕｐＢｙ等）のタプル入力処理を実行する（６０３）。クエリ実行スレッド２００は、上記の入力処理が当該オペレータのオペレータ実行状態保持領域（図中保持領域）２０４へ入力タプルをコピー（または保存）するか否かを判定する（６０４）。すなわち、オペレータがＷｉｎｄｏｗなどの場合には入力タプルをオペレータ実行状態保持領域２０４へコピーするのでステップ６０５へ進み、一方、そうでない場合にはステップ６０６へ進む。
【００７９】
ステップ６０５では、クエリ実行スレッド２００が、当該入力タプルの保存数の増減値を“＋１”に設定し、タプル保存数増減リスト２０３に追加する。
【００８０】
ステップ６０６では、クエリ実行スレッド２００が、上記入力処理において入力タプルをタプル出力バッファ２０２へコピー（または保存）するか否かを判定する。オペレータがＦｉｌｔｅｒなどの場合には入力タプルをタプル出力バッファ２０２へコピー（または保存）するのでステップ６０７へ進み、一方、そうでない場合にはステップ６０８へ進む。
【００８１】
ステップ６０７では、クエリ実行スレッド２００が、入力タプルをタプル出力バッファ２０２へコピーするので、当該入力タプルのタプル保存数増減リスト２０３の値に“＋１”を加算する。
【００８２】
図６Ｂのステップ６０８において、クエリ実行スレッド２００は、現在のオペレータの結果タプル生成処理を実行する。クエリ実行スレッド２００が結果タプルを生成した場合、結果タプルを格納する領域１２２〜１２５と、参照カウンタ３００をタプル用領域管理部２１１から取得する。
【００８３】
次に、ステップ６０９で、クエリ実行スレッド２００は、上記結果タプル生成処理が当該オペレータのオペレータ実行状態保持領域（図中保持領域）２０４へ結果タプルをコピー（または保存）するか否かを判定する。すなわち、オペレータがＪｏｉｎなどの場合には結果タプルをオペレータ実行状態保持領域２０４へコピー（または保存）するのでステップ６１０へ進み、一方、そうでない場合にはステップ６１１へ進む。ステップ６１０では、クエリ実行スレッド２００が、当該結果タプルの保存数の増減値を“＋１”に設定し、タプル保存数増減リスト２０３に追加する。
【００８４】
ステップ６１１では、クエリ実行スレッド２００が、現在のオペレータの結果タプル出力処理を実行する。
【００８５】
ステップ６１２では、クエリ実行スレッド２００が、上記出力処理において結果タプルをタプル出力バッファ２０２へコピー（または保存）するか否かを判定する。オペレータがＧｒｏｕｐＢｙなどの場合には結果タプルをタプル出力バッファ２０２へコピー（または保存）するのでステップ６１３へ進み、一方、そうでない場合にはステップ６１４へ進む。
【００８６】
ステップ６１３では、クエリ実行スレッド２００が、結果タプルをタプル出力バッファ２０２へコピー（または保存）するので、当該結果タプルの保存数の増減値を“＋１”に設定し、タプル保存数増減リスト２０３に追加する。
【００８７】
次に、ステップ６１４では、クエリ実行スレッド２００が、上記出力処理において結果タプルをオペレータ実行状態保持領域２０４から破棄するか否かを判定する。オペレータがＷｉｎｄｏｗやＧｒｏｕｐＢｙなどの場合には結果タプルをオペレータ実行状態保持領域２０４から破棄するのでステップ６１５へ進み、一方、そうでない場合にはステップ６１６へ進む。
【００８８】
ステップ６１５では、クエリ実行スレッド２００が、結果タプルを破棄するので、当該結果タプルの保存数の増減値を“−１”に設定し、タプル保存数増減リスト２０３に追加する。
【００８９】
以上の処理により、各オペレータ１〜１０においてタプル保存数増減リスト２０３の値がタプル毎に更新される。
【００９０】
＜参照カウンタ一括更新＞
図７は、各ＣＰＵコア９で行われる参照カウンタの一括更新処理の一例を示すフローチャートである。参照カウンタ一括更新処理（５１１）は、図５Ａに示したように、ステージＥのオペレータ１０（５１０）の処理が完了した後にクエリ実行スレッド２００で開始される。なお、図５Ｃでは、コア０〜コア３のステージＥ０〜Ｅ４で参照カウンタ一括更新処理が異なる時刻でそれぞれ実行される。
【００９１】
クエリ実行スレッド２００は、タプル保存数増減リスト２０３に格納されたタプル毎にステップ７００〜７０４の処理を繰り返す。ステップ７０１では、クエリ実行スレッド２００がタプルの保存数増減リスト２０３からタプル毎の増減数を取得し、タプル毎に増減数の総和を算出する。クエリ実行スレッド２００は、タプルプール２１０内で該当するタプルの参照カウンタ３００に前記算出した総和を加算する（７０１）。
【００９２】
次に、クエリ実行スレッド２００は、総和を加算した参照カウンタ３００の値が“０”であるか否かを判定する（Ｓ７０２）。参照カウンタ３００の値が“０”であれば、ステップ７０３へ進んで当該タプルに割り当てた領域をタプル用領域管理部２１１に返却する。上記処理をクエリ実行スレッド２００のタプル保存数増減リスト２０３に格納されたタプルの全てについて実行することで、不要となったタプルの領域をタプル用領域管理部２１１に回収させることができる。
【００９３】
そして、本実施例では、タプル参照カウンタ３００を排他的にロックする必要がないので、複数のＣＰＵコア９の待機状態を削減してストリームデータ処理のスループットを向上させることができる。
【００９４】
図９は、参照カウンタの一括更新によりストリームデータ処理を行う例を示すブロック図である。図９は、各コア０〜３でクエリ実行スレッド２００を実行し、それぞれ異なるオペレータを処理する例を示す。また、図中タプル保存数増減リスト２０３は、各コアで実行するクエリ実行スレッド２００に対応付けられたものである。
【００９５】
図中コア０がＧｒｏｕｐＢｙのオペレータを実行して、オペレータ実行状態保持領域２０４の結果タプルをタプル出力バッファ２０２へ保存する例を示す。図中コア１は、Ｊｏｉｎのオペレータを実行し、タプル入力バッファ２０１の入力タプル１２１をオペレータ実行状態保持領域２０４へ保存し、結果タプルをオペレータ実行状態保持領域２０４からタプル出力バッファ２０２へ保存する例を示す。
【００９６】
また、図中コア２はＦｉｌｔｅｒのオペレータを実行して、タプル入力バッファ２０１からタプル出力バッファ２０２へ入力タプルを保存する例を示す。図中コア３はＲｏｗＷｉｎｄｏｗの処理を実行して、タプル入力バッファ２０１の入力タプル１２１をオペレータ実行状態保持領域２０４へ保存し、結果タプルをオペレータ実行状態保持領域２０４からタプル出力バッファ２０２へ保存する例を示す。
【００９７】
各クエリ実行スレッド２００は、それぞれのオペレータ処理を完了するたびに、当該オペレータの処理によって保存数が増減したタプルのポインタを、各クエリ実行スレッド２００のタプル保存数増減リスト２０３に追加する。
【００９８】
タプル保存数増減リスト２０３には、タプルの一時保存領域として機能するオペレータ実行状態保持領域２０４と、クエリ実行スレッド２００のタプル入力バッファ２０１またはタプル出力バッファ２０２との間で入出力されたタプルについて、タプルの増減数を当該タプルのポインタと対応付けて格納する。
【００９９】
そして、クエリグラフの最後のオペレータ（または最後のステージ）の処理が完了すると、クエリ実行スレッド２００は参照カウンタ一括更新処理５１１を実行する。
【０１００】
クエリ実行スレッド２００は、参照カウンタ一括更新処理５１１によって、タプル保存数増減リスト２０３の総和と所定の閾値（例えば、０）から不要になったタプルを判定し、不要と判定したタプルの領域をタプル用領域管理部２１１に回収させる。そして、回収した領域はタプルプール２１０に戻されて新たなタプルの格納先となる。
【０１０１】
なお、上記実施例では、各ＣＰＵコア９が実行するクエリ実行スレッド２００の最後のステージＥで、オペレータ１０が完了した後に、参照カウンタ３００の更新処理を行う例（一括更新スレッド）を示したが、これに限定されるものではない。例えば、図１２で示すように、参照カウンタ３００の一括更新処理を行うコア４を割り当てるようにしても良い。図１２は、各コアで行われるステージの処理と時間の関係の他の例を示すタイムチャート５３１Ａである。
【０１０２】
この例では、ステージＥの参照カウンタ一括更新処理（５１１）に代わって、参照カウンタ３００の一括更新処理を実行する一括更新専用スレッドＵ０〜Ｕ４を独立したコア４に割り当てる。なお、コア４はクエリ実行スレッド２００を割り当てない図である。
【０１０３】
そして、各クエリ実行スレッド２００は、ステージＥ０〜Ｅ４のオペレータ１０が完了する度に、コア４で一括更新専用スレッドＵ０〜Ｕ４を呼び出して起動し、参照カウンタ３００の一括更新処理を実行させる。クエリ実行スレッド２００を割り当てていないＣＰＵコア９が存在する場合には、図１２で示したように、一括更新専用スレッドを用いるようにしてもよい。また、一括更新専用スレッドを複数のＣＰＵコア９に分割して実行しても良く、後述するように、ストリームデータ処理サーバ１００は受け付けた分割数の一括更新専用スレッドをＣＰＵコア９に割り当てるようにしてもよい。
【０１０４】
図８は、ストリームデータ処理部１１０が出力する画面イメージの一例である。画面８００は、例えば、ホスト計算機１３０の入出力装置１３３に表示され、クエリ実行の設定を受け付けるユーザインタフェースとして提供される。
【０１０５】
画面８００内のタプルメモリ管理では、上述の参照カウンタ一括更新処理とコピー処理（後述）の何れかを選択することができる。チェックボックス８０２を選択すると、上述のタプルプール２１０及びタプル用領域管理部２１１により参照カウンタ３００でタプルを格納するメモリ１０３の領域が管理される。
【０１０６】
一方、チェックボックス８０１を選択すると、図１０に示すコピー処理によってタプルの管理が行われる。このコピー処理では、各図で実行されるクエリ実行スレッド２００で、オペレータの処理毎にタプル入力バッファ２０１からオペレータ実行状態保持領域２０４へ入力タプルをコピーし、あるいは、オペレータ実行状態保持領域２０４からタプル出力バッファ２０２へ結果タプルをコピーする。または、タプル入力バッファ２０１と出力バッファ２０２の間でコピーを行う処理である。
【０１０７】
画面８００内の一括更新実行スレッドでは、参照カウンタ一括更新処理について、２つの処理方法の何れかを選択する。チェックボックス８０３を選択すると、図５Ａに示したように最後のオペレータ処理の後に、参照カウンタ一括更新処理を行うステージを設定し、クエリ実行スレッド２００で参照カウンタ３００の更新処理を実行する。
【０１０８】
一方、チェックボックス８０４を選択すると、図１２に示したように、コア４で一括更新専用スレッドＵ０〜Ｕ４を起動して、参照カウンタ３００の一括更新処理を実行させる。
【０１０９】
また、画面８００内の一括更新処理分割数では、一括更新専用スレッドを分割して実行するコア数をプルダウンメニュー８０５から選択することができる。
【０１１０】
図１０は、上述したコピーによりストリームデータ処理を行う例を示すブロック図である。図中コア０がＧｒｏｕｐＢｙのオペレータを実行して、オペレータ実行状態保持領域２０４からタプル出力バッファ２０２へ結果タプルをコピーする例を示す。図中コア１は、Ｊｏｉｎのオペレータを実行し、タプル入力バッファ２０１からオペレータ実行状態保持領域２０４へ入力タプルをコピーし、結果タプルをオペレータ実行状態保持領域２０４からタプル出力バッファ２０２へコピーする例を示す。
【０１１１】
また、図中コア２はＦｉｌｔｅｒのオペレータを実行して、タプル入力バッファ２０１からタプル出力バッファ２０２へ入力タプルをコピーする例を示す。図中コア３はＲｏｗＷｉｎｄｏｗの処理を実行して、タプル入力バッファ２０１からオペレータ実行状態保持領域２０４へ入力タプルをコピーし、結果タプルをオペレータ実行状態保持領域２０４からタプル出力バッファ２０２へコピーする例を示す。
【０１１２】
図１１は、ストリームデータ処理のスループットとＣＰＵコア９の数の関係を示すグラフである。タプルのデータ量が小さい場合（Ｘ  ｂｙｔｅ）及びタプルのデータ量が大きい場合（Ｙ  Ｋｂｙｔｅ）の双方で、タプルを格納するメモリ管理を参照カウンタ一括更新処理で行う本発明が、カウンタをロックする従来例に対して性能の向上を図ることができる。なお、図中Ｘ  ｂｙｔｅは数ｂｙｔｅ〜１０ｂｙｔｅ程度で、Ｙ  Ｋｂｙｔｅは数Ｋｂｙｔｅ程度を示す。また、縦軸はスループットの相対値を示し、例えば、数Ｍタプル／ｓｅｃ等で表すことができる。
【０１１３】
また、図１０に示したコピー処理では、タプルのデータ量が小さい場合に限って従来例よりも性能を向上させることができる。このため、図８に示したクエリ実行の設定画面で、コピー処理を選択可能とする例を示した。
【０１１４】
＜まとめ＞
以上のように、本発明によれば、ストリームデータ処理サーバ１００は、受け付けたストリームクエリ１３２からクエリグラフを生成し、クエリグラフから各オペレータの計算コストを算出する。そして、ストリームデータ処理サーバ１００は、計算コストの総計が所定の閾値以内となるように１以上のオペレータを含むステージに分割して、ひとつのクエリグラフを複数のステージに分割したものをクエリ実行制御情報４０９として生成する。
【０１１５】
ストリームデータ処理サーバ１００は、複数のステージを含むクエリ実行制御情報４０９を順次実行するクエリ実行スレッド２００を複数生成して、複数のＣＰＵコア９に割り当てる。クエリ実行スレッド２００は、先行するクエリ実行スレッド２００の同一のステージ（またはオペレータ）が完了してから、自身のスレッドで当該ステージ（またはオペレータ）を実行する。
【０１１６】
クエリ実行スレッド２００は、各オペレータの処理が完了する度に、タプル保存数増減リスト２０３の値を更新する。タプル保存数増減リスト２０３の値は、オペレータ実行状態保持領域２０４と、タプル入力バッファ２０１またはタプル出力バッファ２０２との間で入出力されたタプルについて、タプルの増減数を当該タプルのポインタと対応付けてタプル保存数増減リスト２０３に格納する。
【０１１７】
そして、クエリ実行スレッド２００は、最後のステージ（またはオペレータ）の処理が完了すると、参照カウンタ３００の一括更新処理を実行して、タプル保存数増減リスト２０３の総和から不要となったタプルを特定し、当該タプルの記憶領域を回収し、再利用する。
【０１１８】
したがって、ある時点では、ひとつのステージ（またはオペレータ）は、ひとつのＣＰＵコア９（＝クエリ実行スレッド２００）でのみ実行されるので、複数のＣＰＵコア９が参照カウンタ一括更新処理を同時に行うことはない。このため、本発明によれば、参照カウンタ３００の排他制御が不要となって、ストリームデータの処理性能を向上させることができるのである。
【０１１９】
この参照カウンタ３００の一括更新処理は、図５Ａで示したように、ひとつのタプルに対するクエリ処理の内、最後のオペレータの後に参照カウンタ一括更新処理を付加する。あるいは、図１２で示したように、ひとつのタプルに対するクエリ処理の内、最後のステージ（またはオペレータ）の後に独立したスレッドで参照カウンタ一括更新処理を実行する例の何れかで行うことができる。
【０１２０】
なお、本発明は上記した実施例に限定されるものではなく、様々な変形例が含まれる。例えば、上記した実施例は本発明を分かりやすく説明するために詳細に記載したものであり、必ずしも説明した全ての構成を備えるものに限定されるものではない。また、ある実施例の構成の一部を他の実施例の構成に置き換えることが可能であり、また、ある実施例の構成に他の実施例の構成を加えることも可能である。また、各実施例の構成の一部について、他の構成の追加、削除、または置換のいずれもが、単独で、または組み合わせても適用可能である。
【０１２１】
また、上記の各構成、機能、処理部、及び処理手段等は、それらの一部または全部を、例えば集積回路で設計する等によりハードウェアで実現してもよい。また、上記の各構成、及び機能等は、ＣＰＵ９０がそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、メモリや、ハードディスク、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）等の記録装置、または、ＩＣカード、ＳＤカード、ＤＶＤ等の記録媒体に置くことができる。
【図１】
2016035189.tif 000003
【図２Ａ】
2016035189.tif 000004
【図２Ｂ】
2016035189.tif 000005
【図２Ｃ】
2016035189.tif 000006
【図３Ａ】
2016035189.tif 000007
【図３Ｂ】
2016035189.tif 000008
【図４】
2016035189.tif 000009
【図５Ａ】
2016035189.tif 000010
【図５Ｂ】
2016035189.tif 000011
【図５Ｃ】
2016035189.tif 000012
【図６Ａ】
2016035189.tif 000013
【図６Ｂ】
2016035189.tif 000014
【図７】
2016035189.tif 000015
【図８】
2016035189.tif 000016
【図９】
2016035189.tif 000017
【図１０】
2016035189.tif 000018
【図１１】
2016035189.tif 000019
【図１２】
2016035189.tif 000020
【国際調査報告】
2016035189.tif 000021
2016035189.tif 000022