(57)【特許請求の範囲】
【請求項１】
プロセッサと、ストリーム処理を実行するストリームプログラム、バッチ処理を実行するバッチプログラム、および前記ストリームプログラムを制御するストリーム処理制御プログラムを記憶するメモリと、を有するデータ処理装置であって、
前記プロセッサは、
前記ストリーム処理制御プログラムにより、時系列なストリームデータ列のうちあるストリームデータからの時系列な第１のストリームデータ群について、当該第１のストリームデータ群の各ストリームデータを要素としてまとめた第１のベクトルデータを生成する第１の生成手順と、
前記ストリーム処理制御プログラムにより、前記時系列なストリームデータ列のうち前記第１のストリームデータ群の中途のストリームデータを先頭とし、かつ、前記第１のストリームデータ群と同数のデータ数である時系列な第２のストリームデータ群について、当該第２のストリームデータ群の各ストリームデータを要素としてまとめた第２のベクトルデータを生成する第２の生成手順と、
前記ストリーム処理制御プログラムにより、前記第１の生成手順および前記第２の生成手順によって生成された第１のベクトルデータおよび第２のベクトルデータを前記バッチプログラムに入力してバッチ処理を実行させる制御手順と、
を実行することを特徴とするデータ処理装置。
【請求項２】
前記プロセッサは、
前記ストリーム処理制御プログラムにより、前記第１のベクトルデータが前記バッチプログラムに入力されて前記制御手順によってバッチ処理が実行された実行結果である第３のベクトルデータについて、当該第３のベクトルデータに含まれる時刻ごとの値である要素群を、時刻に対応する値となる時系列な第３のストリームデータ群に変換する第１の変換手順と、
前記ストリーム処理制御プログラムにより、前記第２のベクトルデータが前記バッチプログラムに入力されて前記制御手順によってバッチ処理が実行された実行結果である第４のベクトルデータについて、当該第４のベクトルデータに含まれる時刻ごとの値である要素群を、時刻に対応する値となる時系列な第４のストリームデータ群に変換する第２の変換手順と、
を実行することを特徴とする請求項１に記載のデータ処理装置。
【請求項３】
前記プロセッサは、
前記ストリーム処理制御プログラムにより、前記ストリームプログラムを制御して実行されたストリーム処理の処理結果である前記第１のストリームデータ群および前記第２のストリームデータ群を出力する出力手順を実行し、
前記第１の生成手順では、
前記ストリーム処理制御プログラムにより、前記出力手順によって出力された前記第１のストリームデータ群について、前記第１のベクトルデータを生成し、
前記第２の生成手順では、
前記ストリーム処理制御プログラムにより、前記出力手順によって出力された前記第２のストリームデータ群について、前記第２のベクトルデータを生成することを特徴とする請求項１に記載のデータ処理装置。
【請求項４】
前記プロセッサは、
前記ストリーム処理制御プログラムにより、前記第１のストリームデータ群および前記第２のストリームデータ群に存在するデータの個数と同数である、前記第１のベクトルデータおよび前記第２のベクトルデータに含ませる要素数を、入力データサイズとして設定し、前記第１のストリームデータ群と前記第２のストリームデータ群との間でのストリームデータの重複数と同数である、前記第１のベクトルデータと前記第２のベクトルデータとの間の前記要素の重複数を、重なり幅として設定する設定手順を実行し、
前記第１の生成手順では、
前記ストリーム処理制御プログラムにより、前記設定手順によって設定された入力データサイズおよび重なり幅にしたがって、前記第１のストリームデータ群について、前記第１のベクトルデータを生成し、
前記第２の生成手順では、
前記ストリーム処理制御プログラムにより、前記設定手順によって設定された入力データサイズおよび重なり幅にしたがって、前記第２のストリームデータ群について、前記第２のベクトルデータを生成することを特徴とする請求項１に記載のデータ処理装置。
【請求項５】
前記プロセッサは、
前記設定手順では、
前記ストリーム処理制御プログラムにより、前記バッチプログラムで前記時系列なストリームデータ列の各ストリームデータが入力されてからバッチ処理が完了するまでのレスポンス時間と、前記バッチプログラムに前記各ストリームデータが入力される間隔である入力レートと、前記バッチプログラムが単位時間当たりに処理するベクトルデータの要素数である処理スループットと、に基づいて、前記入力データサイズを設定することを特徴とする請求項４に記載のデータ処理装置。
【請求項６】
前記プロセッサは、
前記時系列なストリームデータ列のうちキューに格納されているストリームデータの個数である処理対象データ数と、前記ストリーム処理制御プログラムにより現在前記バッチプログラムが単位時間当たりに処理するベクトルデータの要素数である処理スループットと、を取得する取得手順と、
前記取得手順によって取得された処理スループットと、前記キューに格納されているストリームデータが有する時刻のうち最古の時刻と、前記バッチプログラムで前記時系列なストリームデータ列の各ストリームデータが入力されてからバッチ処理が完了するまでのレスポンス時間と、に基づいて、前記バッチプログラムでの処理可能なストリームデータ数を算出する算出手順と、を実行し、
前記設定手順では、
前記取得手順によって取得された処理対象データ数と、前記重なり幅と、前記算出手順によって算出された処理可能なストリームデータ数と、に基づいて、前記入力データサイズを設定することを特徴とする請求項４に記載のデータ処理装置。
【請求項７】
プロセッサと、バッチ処理を実行するバッチプログラム、ストリーム処理を実行するストリームプログラム、および前記バッチプログラムを制御するバッチ処理制御プログラムを記憶するメモリと、を有するデータ処理装置であって、
前記プロセッサは、
前記バッチ処理制御プログラムにより、時刻ごとの値である要素列を含むベクトルデータから、前記要素列内の第１の要素群の各要素を分割して時系列にした第１のストリームデータ群を生成する第１の生成手順と、
前記バッチ処理制御プログラムにより、前記要素列のうち前記第１の要素群の中途の要素を先頭とし、かつ、前記第１の要素群と同数の要素数である時系列な第２の要素群について、当該第２の要素群の各要素を分割して時系列にした第２のストリームデータ群を生成する第２の生成手順と、
前記バッチ処理制御プログラムにより、前記第１の生成手順および前記第２の生成手順によって生成された第１のストリームデータ群および第２のストリームデータ群を前記ストリームプログラムに入力してストリーム処理を実行させる制御手順と、
前記バッチ処理制御プログラムにより、前記第１のストリームデータ群が前記ストリームプログラムに入力されて前記制御手順によってストリーム処理が実行された実行結果である第３のストリームデータ群のストリームデータを取得し、前記第２のストリームデータ群が前記ストリームプログラムに入力されて前記制御手順によってストリーム処理が実行された実行結果である第４のストリームデータ群を取得し、当該第４のストリームデータ群から前記第３のストリームデータ群のストリームデータと重複するストリームデータを除外した除外後のストリームデータ群を第２のベクトルデータに変換する変換手順と、
を実行することを特徴とするデータ処理装置。
【請求項８】
前記プロセッサは、
前記バッチ処理制御プログラムにより、前記第１のストリームデータ群および前記第２のストリームデータ群に含ませるストリームデータの個数である入力データサイズと、前記第１のストリームデータ群と前記第２のストリームデータ群との間のストリームデータの重複数である重なり幅と、を設定する設定手順を実行し、
前記第１の生成手順は、
前記バッチ処理制御プログラムにより、前記設定手順によって設定された入力データサイズおよび重なり幅にしたがって、前記第１のベクトルデータから、前記第１のストリームデータ群を生成し、
前記第２の生成手順は、
前記バッチ処理制御プログラムにより、前記設定手順によって設定された入力データサイズおよび重なり幅にしたがって、前記第１のベクトルデータから、前記第２のストリームデータ群を生成することを特徴とする請求項７に記載のデータ処理装置。
【請求項９】
プロセッサと、ストリーム処理を実行するストリームプログラム、バッチ処理を実行するバッチプログラム、および前記ストリームプログラムを制御するストリーム処理制御プログラムを記憶するメモリと、を有するデータ処理装置が実行するデータ処理方法であって、
前記プロセッサは、
前記ストリーム処理制御プログラムにより、時系列なストリームデータ列のうちあるストリームデータからの時系列な第１のストリームデータ群について、当該第１のストリームデータ群の各ストリームデータを要素としてまとめた第１のベクトルデータを生成する第１の生成手順と、
前記ストリーム処理制御プログラムにより、前記時系列なストリームデータ列のうち前記第１のストリームデータ群の中途のストリームデータを先頭とし、かつ、前記第１のストリームデータ群と同数のデータ数である時系列な第２のストリームデータ群について、当該第２のストリームデータ群の各ストリームデータを要素としてまとめた第２のベクトルデータを生成する第２の生成手順と、
前記ストリーム処理制御プログラムにより、前記第１の生成手順および前記第２の生成手順によって生成された第１のベクトルデータおよび第２のベクトルデータを前記バッチプログラムに入力してバッチ処理を実行させる制御手順と、
を実行することを特徴とするデータ処理方法。
【請求項１０】
前記プロセッサは、
前記ストリーム処理制御プログラムにより、前記第１のベクトルデータが前記バッチプログラムに入力されて前記制御手順によってバッチ処理が実行された実行結果である第３のベクトルデータについて、当該第３のベクトルデータに含まれる時刻ごとの値である要素群を、時刻に対応する値となる時系列な第３のストリームデータ群に変換する第１の変換手順と、
前記ストリーム処理制御プログラムにより、前記第２のベクトルデータが前記バッチプログラムに入力されて前記制御手順によってバッチ処理が実行された実行結果である第４のベクトルデータについて、当該第４のベクトルデータに含まれる時刻ごとの値である要素群を、時刻に対応する値となる時系列な第４のストリームデータ群に変換する第２の変換手順と、
を実行することを特徴とする請求項９に記載のデータ処理方法。
【請求項１１】
前記プロセッサは、
前記ストリーム処理制御プログラムにより、前記ストリームプログラムを制御して実行されたストリーム処理の処理結果である前記第１のストリームデータ群および前記第２のストリームデータ群を出力する出力手順を実行し、
前記第１の生成手順では、
前記ストリーム処理制御プログラムにより、前記出力手順によって出力された前記第１のストリームデータ群について、前記第１のベクトルデータを生成し、
前記第２の生成手順では、
前記ストリーム処理制御プログラムにより、前記出力手順によって出力された前記第２のストリームデータ群について、前記第２のベクトルデータを生成することを特徴とする請求項９に記載のデータ処理方法。
【請求項１２】
前記プロセッサは、
前記ストリーム処理制御プログラムにより、前記第１のストリームデータ群および前記第２のストリームデータ群に存在するデータの個数と同数である、前記第１のベクトルデータおよび前記第２のベクトルデータに含ませる要素数を、入力データサイズとして設定し、前記第１のストリームデータ群と前記第２のストリームデータ群との間でのストリームデータの重複数と同数である、前記第１のベクトルデータと前記第２のベクトルデータとの間の前記要素の重複数を、重なり幅として設定する設定手順を実行し、
前記第１の生成手順では、
前記ストリーム処理制御プログラムにより、前記設定手順によって設定された入力データサイズおよび重なり幅にしたがって、前記第１のストリームデータ群について、前記第１のベクトルデータを生成し、
前記第２の生成手順では、
前記ストリーム処理制御プログラムにより、前記設定手順によって設定された入力データサイズおよび重なり幅にしたがって、前記第２のストリームデータ群について、前記第２のベクトルデータを生成することを特徴とする請求項９に記載のデータ処理方法。
【請求項１３】
前記プロセッサは、
前記設定手順では、
前記ストリーム処理制御プログラムにより、前記バッチプログラムで前記時系列なストリームデータ列の各ストリームデータが入力されてからバッチ処理が完了するまでのレスポンス時間と、前記バッチプログラムに前記各ストリームデータが入力される間隔である入力レートと、前記バッチプログラムが単位時間当たりに処理するベクトルデータの要素数である処理スループットと、に基づいて、前記入力データサイズを設定することを特徴とする請求項１２に記載のデータ処理方法。
【請求項１４】
前記プロセッサは、
前記時系列なストリームデータ列のうちキューに格納されているストリームデータの個数である処理対象データ数と、前記ストリーム処理制御プログラムにより現在前記バッチプログラムが単位時間当たりに処理するベクトルデータの要素数である処理スループットと、を取得する取得手順と、
前記取得手順によって取得された処理スループットと、前記キューに格納されているストリームデータが有する時刻のうち最古の時刻と、前記バッチプログラムで前記時系列なストリームデータ列の各ストリームデータが入力されてからバッチ処理が完了するまでのレスポンス時間と、に基づいて、前記バッチプログラムでの処理可能なストリームデータ数を算出する算出手順と、を実行し、
前記設定手順では、
前記取得手順によって取得された処理対象データ数と、前記重なり幅と、前記算出手順によって算出された処理可能なストリームデータ数と、に基づいて、前記入力データサイズを設定することを特徴とする請求項１２に記載のデータ処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データを処理するデータ処理装置およびデータ処理方法に関する。
【背景技術】
【０００２】
時系列データの監視処理では、センサやログなどの時系列データに対して事前にプログラムでルールが定義され、そのルールに従って時系列データのフィルタリングや集計、異常検知、将来予測などの処理が実行される。時系列データの監視処理の例としては、工場のプラントやサーバの監視が挙げられる。工場のプラント監視処理は、機械に取り付けられた温度や電圧などのセンサの値を取得し、そのセンサの値の数時間〜日毎の時系列の変化から特異点を抽出し異常と判定する処理である。一方、サーバの監視処理は、サーバのログからＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やハードディスクの使用量、あるいはネットワークのパケット量を取得し、数秒〜数時間の時系列の変化を監視することで異常検出を行う処理である。時系列データの監視処理のプログラムの実行方法として、バッチ処理及びストリーム処理が挙げられる。【０００３】
バッチ処理を行うプログラム（以下、「バッチプログラム」）は、ファイルやデータベースなどに蓄積されている時系列データを纏めてベクトルデータとして入力し、その処理結果を纏めてベクトルデータとして出力する。バッチプログラムの実行を支援するミドルウェアとしては、下記特許文献１に開示されているバッチ処理基盤が挙げられる。バッチ処理基盤は、バッチプログラムのスケジューリングや、起動、停止などを実行するミドルウェアである。バッチ処理は、工場プラントの監視などレスポンス時間の要件が低く、逆に高い処理スループットや低コストが求められる案件に活用される。【０００４】
一方、ストリーム処理を行うプログラム（以下、「ストリームプログラム」）は、時々刻々と配信するストリームデータを、逐次処理し、その処理結果もストリームデータとして逐次出力する。ストリームプログラムの実行を支援するミドルウェアとしては、非特許文献１に開示されているストリーム処理基盤が挙げられる。ストリーム処理基盤は、ストリームプログラムのスケジューリングや、起動、停止などを実行するミドルウェアである。ストリーム処理としては、サーバの監視などレスポンス時間の要件が高く、逆に処理スループットやコストの用件が低い案件に活用される。【０００５】
時系列データの監視処理の案件の拡大に伴い、案件毎にプログラムを開発することは難しくなっており、既存のストリームプログラムやバッチプログラムを様々な案件で再利用する必要性が出てきている。しかし、工場プラントやサーバの監視などのように、案件毎に求められるレスポンス時間や処理スループットなどの要件が異なる。したがって、レスポンス時間の短縮のために既存のバッチプログラムをストリーム処理基盤で実行することや、処理スループット向上のため既存のストリームプログラムをバッチ処理基盤で実行することが求められる。【０００６】
特許文献１は、ストリームプログラムをバッチ基盤で動作することを支援する。そのため、特許文献１は、バッチ処理基盤上で蓄積データに対して、入力データの時間範囲を指定し、その範囲内のデータに対し、ストリームデータに変換し、ストリームプログラムで実行する。一方、非特許文献１は、バッチプログラムをストリーム基盤で動作することを支援する。そのため、非特許文献１は、ストリーム処理基盤上で複数のストリームデータをＳｉｇＳｅｇｓと呼ぶデータブロックに纏め、そのデータブロックを入出力とするバッチプログラムを実行する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１１−２２１７９９号公報
【非特許文献】
【０００８】
【非特許文献１】L. Girod, Y. Mei, S. Rost, A. Thiagarajan, H. Balakrishnan, S. Madden, "XStream: a Signal-Oriented Data Stream Management System", International Conference on Data Engineering (ICDE), Apr 2008.
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、非特許文献１のストリーム処理基盤でバッチプログラムを実行する場合、複数のデータブロックに同一のストリームデータを持たせること、すなわちバッチプログラムの入力データに重なりを持たせることは、考慮されていない。したがって、非特許文献１のストリーム処理基盤上で、時系列データを一定件数ずつウィンドウに保持し、そのウィンドウをスライドして処理を行うバッチプログラムを実行することができないという問題がある。【００１０】
また、特許文献１のバッチ処理基盤は、ストリームデータに重なりを持たせることは、考慮されていない。したがって、特許文献１のバッチ処理基盤上で、ウィンドウをスライドさせて実行するストリームプログラムを実行することができないという問題がある。【００１１】
このように、バッチ処理およびストリーム処理について、処理基盤と当該処理基盤上で実行されるプログラムとで処理内容が異なる場合、時系列データに重なりを持たせることができないという問題がある。【００１２】
本発明は、上述した問題点を解決するため、バッチ処理およびストリーム処理について、一方の処理基盤上で実行する他方の処理のプログラムのコードやアルゴリズムを変更することなく、一方の処理基盤上で他方の処理のプログラムを時系列データに重なりを持たせて実行可能にすることを目的とする。
【課題を解決するための手段】
【００１３】
本願において開示される発明の一側面となるデータ処理装置およびデータ処理方法は、プロセッサと、ストリーム処理を実行するストリームプログラム、バッチ処理を実行するバッチプログラム、および前記ストリームプログラムを制御するストリーム処理制御プログラムを記憶するメモリと、を有するデータ処理装置および当該データ処理装置が実行するデータ処理方法であって、前記プロセッサは、前記ストリーム処理制御プログラムにより、時系列なストリームデータ列のうちあるストリームデータからの時系列な第１のストリームデータ群について、当該第１のストリームデータ群の各ストリームデータを要素としてまとめた第１のベクトルデータを生成する第１の生成手順と、前記ストリーム処理制御プログラムにより、前記時系列なストリームデータ列のうち前記第１のストリームデータ群の中途のストリームデータを先頭とし、かつ、前記第１のストリームデータと同数のデータ数である時系列な第２のストリームデータ群について、当該第２のストリームデータ群の各ストリームデータを要素としてまとめた第２のベクトルデータを生成する第２の生成手順と、前記ストリーム処理制御プログラムにより、前記第１の生成手順および前記第２の生成手順によって生成された第１のベクトルデータおよび第２のベクトルデータを前記バッチプログラムに入力してバッチ処理を実行させる制御手順と、を実行する。【００１４】
また、本願において開示される発明の他の側面となるデータ処理装置およびデータ処理方法は、プロセッサと、バッチ処理を実行するバッチプログラム、ストリーム処理を実行するストリームプログラム、および前記バッチプログラムを制御するバッチ処理制御プログラムを記憶するメモリと、を有するデータ処理装置および当該データ処理装置が実行するデータ処理方法であって、前記プロセッサは、前記バッチ処理制御プログラムにより、時刻ごとの値である要素列を含むベクトルデータから、前記要素列内の第１の要素群の各要素を分割して時系列にした第１のストリームデータ群を生成する第１の生成手順と、前記バッチ処理制御プログラムにより、前記要素列のうち前記第１の要素群の中途の要素を先頭とし、かつ、前記第１の要素群と同数の要素数である時系列な第２の要素群について、当該第２の要素群の各要素を分割して時系列にした第２のストリームデータ群を生成する第１の生成手順と、前記バッチ処理制御プログラムにより、前記第１の生成手順および前記第２の生成手順によって生成された第１のストリームデータ群および第２のストリームデータ群を前記ストリームプログラムに入力してストリーム処理を実行させる制御手順と、前記バッチ処理制御プログラムにより、前記第１のストリームデータ群が前記ストリームプログラムに入力されて前記制御手順によってストリーム処理が実行された実行結果である第３のストリームデータ群のストリームデータを取得し、前記第２のストリームデータ群が前記ストリームプログラムに入力されて前記制御手順によってストリーム処理が実行された実行結果である第４のストリームデータ群を取得し、当該第４のストリームデータ群から前記第３のストリームデータ群のストリームデータと重複するストリームデータを除外した除外後のストリームデータ群を第２のベクトルデータに変換する変換手順と、を実行する。
【発明の効果】
【００１５】
本発明の代表的な実施の形態によれば、バッチ処理およびストリーム処理について、一方の処理基盤上で実行する他方の処理のプログラムのコードやアルゴリズムを変更することなく、一方の処理基盤上で他方の処理のプログラムを時系列データに重なりを持たせて実行することができる。前述した以外の課題、構成及び効果は、以下の実施例の説明により明らかにされる。
【図面の簡単な説明】
【００１６】
【図１】ストリーム処理基盤上でバッチプログラムを実行する例１を示す説明図である。
【図２】ストリーム処理基盤上でバッチプログラムを実行する例２を示す説明図である。
【図３】ストリーム処理システムの一例を示すシステム構成図である。
【図４】図３に示したストリームプログラム群の中のあるストリームプログラムの一例を示す説明図である。
【図５】ストリームデータの一例を示す説明図である。
【図６】図３に示したバッチプログラム群の中のあるバッチプログラムの一例を示す説明図である。
【図７】ベクトルデータの一例を示す説明図である。
【図８】図３に示したバッチプログラム入出力静的決定部の入出力関係を示す説明図である。
【図９】図８に示したプログラム構成の一例を示す説明図である。
【図１０】図８に示したプラットフォーム要件の一例を示す説明図である。
【図１１】図８に示したバッチ実行仕様の一例を示す説明図である。
【図１２】図３に示したバッチプログラム入出力動的決定部の入出力関係を示す説明図である。
【図１３】バッチ実行モニタリング値の一例を示す説明図である。
【図１４】図８および図１２に示したバッチプログラム入出力設定の一例を示す説明図である。
【図１５】図３に示したバッチプログラム実行部の入出力の関係を示す説明図である。
【図１６】重なりデータ格納領域の一例を示す説明図である。
【図１７】バッチプログラム入出力静的決定部による処理手順例を示すフローチャートである。
【図１８】バッチ実行モニタリング部による処理手順例を示すフローチャートである。
【図１９】第１の動的決定部による処理手順例を示すフローチャートである。
【図２０】入力データ・ストリームＴＯベクトル変換部による処理手順例を示すフローチャートである。
【図２１】ストリームデータからベクトルデータへの変換例を示す説明図である。
【図２２】出力データ・ベクトルＴＯストリーム変換部による処理手順例を示すフローチャートである。
【図２３】ベクトルデータＶＤからストリームデータへの変換例を示す説明図である。
【図２４】バッチ処理基盤上でストリームプログラムを実行する例１を示す説明図である。
【図２５】バッチ処理基盤上でストリームプログラムを実行する例２を示す説明図である。
【図２６】バッチ処理システムの一例を示すシステム構成図である。
【図２７】図２６に示したストリームプログラム入出力設定静的決定部の入出力関係を示す説明図である。
【図２８】ストリーム実行仕様の一例を示す説明図である。
【図２９】図２６に示したストリームプログラム入出力設定動的決定部の入出力関係を示す説明図である。
【図３０】ストリーム実行モニタリング値の一例を示す説明図である。
【図３１】図２７および図２９に示したストリームプログラム入出力設定の一例を示す説明図である。
【図３２】図２６に示したストリームプログラム実行部の入出力の関係を示す説明図である。
【図３３】図３２に示した重なりデータ時刻の一例を示す説明図である。
【図３４】オペレータツリーの一例を示す説明図である。
【図３５】図３２に示した計算状態格納領域の一例を示す説明図である。
【図３６】第２の静的決定部による処理手順例を示すフローチャートである。
【図３７】ストリーム実行モニタリング部による処理手順例を示すフローチャートである。
【図３８】第２の動的決定部による処理手順例を示すフローチャートである。
【図３９】図３２に示した入力データ・ベクトルＴＯストリーム変換部による処理手順例を示すフローチャートである。
【図４０】ベクトルデータからストリームデータへの変換例を示す説明図である。
【図４１】図３２に示した出力データ・ストリームＴＯベクトル変換部による処理手順例を示すフローチャートである。
【図４２】ストリームデータからベクトルデータへの変換例を示す説明図である。
【図４３】図３２に示した計算状態読出し部による処理手順を示すフローチャートである。
【図４４】図３２に示した計算状態保持部による処理手順を示すフローチャートである。
【発明を実施するための形態】
【００１７】
本発明は、バッチ処理およびストリーム処理について、一方の処理基盤と当該一方の処理基盤上で他方の処理のプログラムを実行する場合、時系列データに重なりを持たせて他方の処理を実行する。これにより、一方の処理基盤上で実行する他方の処理のプログラムのコードやアルゴリズムを変更することなく、一方の処理基盤上で他方の処理のプログラムを実行可能にする。
【００１８】
したがって、既存のプログラムを処理が異なる処理基盤上で流用することができ、容易かつ効率的にプログラムを実行することができる。以下、ストリーム処理基盤上でバッチプログラムを実行する例（実施例１）と、バッチ処理基盤上でストリームプログラムを実行する例（実施例２）と、に分けて説明する。
【００１９】
なお、本明細書において「プログラム」や「処理基盤」を主語として説明を行う場合があるが、プログラムや「処理基盤」は、プロセッサによって実行されることで定められた処理をメモリ及び通信ポート（通信制御デバイス）を用いながら行うため、プロセッサを主語とした説明としてもよい。また、プログラムを主語として開示された処理は計算機が行う処理としてもよい。また、プログラムの一部または全ては専用ハードウェアによって実現されてもよい。
【００２０】
（実施例１）
図１および図２は、ストリーム処理基盤上でバッチプログラムを実行する例を示す説明図である。図１は、データの重なりを持たせない場合の実行例である。バッチプログラムは、ウィンドウ幅となるデータ数が４個、スライドさせるデータ数であるスライド数が２個となるプログラム構成とする。なお、時刻の単位は、一例として「秒」とする。ストリーム処理基盤は、ウィンドウ幅４個のストリームデータを２個ずつスライドさせながら、所定の計算を実行する。
【００２１】
時刻１：０３において、ストリーム処理基盤は、ストリームＴＯベクトル変換１００により、時刻１：００〜１：０３のストリームデータ列１０１を、データブロックであるベクトルデータ１０２に変換する。これにより、ストリーム処理基盤は、ベクトルデータ１０２をバッチプログラムＢＰに与え、バッチプログラムＢＰはベクトルデータ１０２を用いて計算を実行する。なお、スライド数が２個であるため、つぎに対象となるストリームデータ列は、時刻１：０５のストリームデータ列１０３である。
【００２２】
時刻１：０５のストリームデータ列１０３は、時刻１：０２および１：０３のストリームデータを含むため、ストリームデータ列１０１と重なる。ストリーム処理基盤は、データの重なりを持たせないので、ストリームＴＯベクトル変換１００により、ストリームデータ列１０３をベクトルデータ１０４に変換することができない。したがって、ストリーム処理基盤は、ベクトルデータ１０４をバッチプログラムＢＰに与えることができず、バッチプログラムＢＰはベクトルデータ１０４を用いた計算を実行することができない。なお、スライド数が２個であるため、つぎに対象となるストリームデータ列は、時刻１：０７のストリームデータ列１０５である。
【００２３】
時刻１：０７のストリームデータ列１０５は、ストリームデータ列１０１内のストリームデータと重ならない。ストリーム処理基盤は、変換後のベクトルデータにおいてデータの重なりを持たせないので、ストリームデータ列１０５が与えられると、ストリームＴＯベクトル変換１００により、ベクトルデータ１０６に変換する。これにより、ストリーム処理基盤は、ベクトルデータ１０６をバッチプログラムＢＰに与え、バッチプログラムＢＰはベクトルデータ１０６を用いて計算を実行する。
【００２４】
図２は、データの重なりを持たせる場合の実行例である。バッチプログラムのプログラム構成は、図１と同様である。また、図２では、プラットフォーム要件であるレスポンスを１６秒とする。レスポンスとは、ストリームデータが入力されてから処理が完了するまでの時間である。
【００２５】
ストリーム処理基盤は、プログラム構成とプラットフォーム要件とに基づいて、入力データサイズと重なり幅を決定する。入力データサイズとは、変換されるベクトルデータに含まれるストリームデータの個数である。ここでは、８個とする。また、重なり幅を図１と同様２個とする。
【００２６】
まず、時刻１：０３において、ストリーム処理基盤は、ストリームＴＯベクトル変換１００により、時刻０：５６〜１：０３のストリームデータ列２０１を、データブロックであるベクトルデータ２０２に変換する。これにより、ストリーム処理基盤は、ベクトルデータ２０２をバッチプログラムＢＰに与え、バッチプログラムＢＰはベクトルデータ２０２を用いて計算を実行する。なお、スライド数が２個であるため、つぎに対象となるストリームデータ列は、時刻１：０５のストリームデータ列２０３である。
【００２７】
時刻１：０５のストリームデータ列２０３は、時刻０：５８〜１：０３のストリームデータを含むため、ストリームデータ列２０１との重なり幅は６個となる。設定された重なり幅である２個を超えたため、時刻１：０５では、ストリーム処理基盤は、ストリームＴＯベクトル変換１００により、ストリームデータ列２０３をベクトルデータに変換しない。なお、スライド数が２個であるため、つぎに対象となるストリームデータ列は、時刻１：０７のストリームデータ列２０５である。
【００２８】
時刻１：０７においても、時刻１：０５と同様、時刻１：０７のストリームデータ列２０５は、時刻１：００〜１：０３のストリームデータを含むため、ストリームデータ列２０１との重なり幅は４個となる。設定された重なり幅である２個を超えたため、時刻１：０７でも、ストリーム処理基盤は、ストリームＴＯベクトル変換１００により、ストリームデータ列２０５をベクトルデータに変換しない。なお、スライド数が２個であるため、つぎに対象となるストリームデータ列は、時刻１：０９のストリームデータ列２０７である。
【００２９】
時刻１：０９のストリームデータ列２０７は、時刻１：０２〜１：０３のストリームデータを含むため、ストリームデータ列２０１との重なり幅は２個となる。設定された重なり幅である２個と一致するため、時刻１：０９では、ストリーム処理基盤は、ストリームＴＯベクトル変換１００により、ストリームデータ列２０７をベクトルデータ２０８に変換する。これにより、ストリーム処理基盤は、ベクトルデータ２０８をバッチプログラムＢＰに与え、バッチプログラムＢＰはベクトルデータ２０８を用いて計算を実行する。
【００３０】
このように、図２の例では、ベクトルデータ２０２，２０８間でデータの重なりを持たせることができるため、図１のベクトルデータ１０４のような計算実行不可という状態を回避することができ、バッチプログラムのセマンティックスを保持することができる。また、設定された重なり幅分のデータだけが重複するように、ベクトルデータのデータサイズが決定される。図２の例では、時刻１：０５、１：０７において、ベクトルデータは生成されない。このベクトルデータを生成しなくても、ベクトルデータ２０２、２０８で網羅できるからである。このように、重なり幅を超えるベクトルデータの生成を抑制することができるため、処理負荷の軽減を図ることができる。
【００３１】
＜システム構成例＞
図３は、ストリーム処理システム３００の一例を示すシステム構成図である。ストリーム処理システム３００は、クライアント３０１と、データソース３０２と、ストリーム処理サーバ３０３と、が、ネットワークを介して通信可能に接続された構成である。ネットワーク３０４は、イーサネット（登録商標）、光ファイバなどで接続されるローカルエリアネットワーク（ＬＡＮ）、またはＬＡＮよりも低速なインターネットを含んだワイドエリアネットワーク（ＷＡＮ）でも差し支えない。また、クライアント３０１、データソース３０２、およびストリーム処理サーバ３０３は、パーソナルコンピュータ（ＰＣ）、ブレード型の計算機システムなどの任意のコンピュータシステムでよい。
【００３２】
クライアント３０１は、ストリーム処理サーバ３０３に対し登録処理を実行する計算機である。登録処理の詳細については後述する。
【００３３】
データソース３０２は、ストリーム処理サーバ３０３に、処理対象となる一連の時系列データを供給する供給源であり、たとえば、上述した工場のプラントやサーバが挙げられる。工場のプラントの場合、たとえば、機械に取り付けられた温度や電圧などのセンサの値が時系列データとなる。また、サーバの場合、たとえば、サーバのログから得られるＣＰＵやハードディスクの使用量、またはネットワーク３０４のパケット量が時系列データとなる。
【００３４】
ストリーム処理サーバ３０３は、ＣＰＵ３１１、メモリ３１２、Ｉ／Ｏインターフェース３１３およびストレージ３１４が、バス３１５で結合された計算機である。ストリーム処理サーバ３０３は、Ｉ／Ｏインターフェース３１３を介してネットワーク３０４にアクセスする。また、ストリーム処理サーバ３０３は、処理結果、処理の中間結果、システム動作に必要な設定データを、不揮発性のストレージ３１４に格納することができる。ストレージ３１４は、Ｉ／Ｏインターフェース３１３を介して直接接続されるが、ストリーム処理サーバ３０３外において、Ｉ／Ｏインターフェース３１３によりネットワーク３０４を介して接続されることとしてもよい。
【００３５】
メモリ３１２には、ストリーム処理基盤３２１がマッピングされる。ストリーム処理基盤３２１は、１以上のストリームプログラムであるストリームプログラム群３３１の起動、停止モジュールやスケジューリングモジュールなど一般的なストリーム処理のモジュールがマッピングされたミドルウェアである。このほかに、ストリーム処理基盤３２１には、バッチプログラム入出力静的決定部３３２、バッチプログラム入出力動的決定部３３３、１以上のバッチプログラムであるバッチプログラム群３３４を含むバッチプログラム実行部３３５がマッピングされる。
【００３６】
＜ストリームプログラム＞
図４は、図３に示したストリームプログラム群３３１の中のあるストリームプログラムの一例を示す説明図である。ストリームプログラム４００は、ストリームデータを入出力とするプログラムである。図４では、ＣＱＬ（Ｃｏｎｔｉｎｕｏｕｓ  Ｑｕｅｒｙ  Ｌａｎｇｕａｇｅ）言語で定義されたストリームプログラム４００を示す。ストリームプログラム４００は入力ストリーム定義、出力ストリーム定義、およびクエリ定義群を含む。
【００３７】
入力ストリーム定義として、「時刻」および「計測値」をカラムとするセンサストリーム４０１が定義される。また、出力ストリーム定義として、「時刻」および「計測値」をカラムとする異常センサストリーム４０２が定義される。
【００３８】
クエリ定義群は、クエリ定義１とクエリ定義２とを含む。クエリ定義１として、ノイズ除去クエリ４０３が定義され、クエリ定義２として、異常センサクエリ４０４が定義される。ノイズ除去クエリ４０３は、センサストリーム４０１からストリームデータを入力し、直近４個の計測値の平均値を算出するクエリである。
【００３９】
異常センサクエリ４０４は、ノイズ除去クエリ４０３で算出された平均値がαより大きい場合に、センサストリーム４０１のストリームデータを、異常センサストリーム４０２に出力するクエリである。なお、図４は、ストリームプログラム４００の一例であり、ＣＱＬ言語の他に、Ｃ言語やＪａｖａ言語やその他の任意のプログラミング言語でストリームプログラム４００を定義してもよい。
【００４０】
図５は、ストリームデータの一例を示す説明図である。ストリームデータ５００〜５１３は時刻を持ち、ストリーム格納キューＱに時刻順に格納される。図５では、凡例に示すようにカラムとして時刻、計測値を持つストリームデータ５００〜５１３を示す。ストリーム格納キューＱには、先頭に時刻「１：００」、計測値「１０．０」のストリームデータ５０が格納され、続いて時刻「１：０１」、計測値「１５．０」のストリームデータ５０１、時刻「１：０２」、計測値「１４．０」のストリームデータ５０２が格納される。そしてストリーム格納キューＱの最後尾に時刻「１：１３」、計測値「１２．０」のストリームデータ５１３が格納される。
【００４１】
＜バッチプログラム＞
図６は、図３に示したバッチプログラム群３３４の中のあるバッチプログラムの一例を示す説明図である。バッチプログラム６００は、ベクトルデータを入出力とするプログラムである。図５では、バッチプログラム６００は、ベクトルデータの定義とバッチ処理関数とを含む。
【００４２】
ベクトルデータ定義として、「時刻」および「計測値」をカラムとするセンサ配列６０１が定義される。また、バッチ処理関数定義として、前処理関数６０２が定義される。前処理関数６０２は、センサ配列６０１を入力とし、関数ＳＭＯＯＴＨＩＮＧにより直近３個の計測値に対して重み付き平均を求め、計測値の平滑化を行う関数である。
【００４３】
そして、前処理関数６０２は、平滑化した値に対して、関数ＤＥＲＩＶＡＴＩＯＮにより現在値と一つ前の値から微分値を算出する。なお、関数ＤＥＲＩＶＡＴＩＯＮは、ベクトルデータの要素に対してサンプリングを行い、要素数を５０％削減する関数である。例えば、時刻１：０１、１：０２、１：０３、１：０４、１：０５、１：０６、１：０７、１：０８の８個の要素を関数ＤＥＲＩＶＡＴＩＯＮに入力した場合、関数ＤＥＲＩＶＡＴＩＯＮは、８個の要素のうち５０％を削減する。その結果、時刻１：０１、１：０３、１：０５、１：０７の４個の要素が出力される。前処理関数６０２は、関数ＤＥＲＩＶＡＴＩＯＮで算出した微分値をセンサ配列６０１に出力し、処理を終了する。
【００４４】
なお、図６は、バッチプログラム６００の一例であり、Ｒ言語や、Ｃ言語、Ｊａｖａ言語やその他の任意のプログラミング言語でバッチプログラム６００を定義してもよい。
【００４５】
図７は、ベクトルデータの一例を示す説明図である。ベクトルデータＶＤは複数の要素を持つ集合体である。図７に示すベクトルデータＶＤは配列として実現され、配列の各要素は時刻と計測値の値を持つ。配列の要素として、インデックス０に時刻「０：５８」、計測値「１１．０」の要素７００を持ち、インデックス１に時刻「０：５９」、計測値「１４．０」の要素７０１、インデックス２に時刻「１：００」、計測値「１０．０」の要素７０２、最後にインデックス７に時刻「１：０５」、計測値「１２．０」の要素７０７を持つ。なおベクトルデータＶＤの実現方法は、配列の他にリストやその他のデータ構造でもよい。
【００４６】
＜バッチプログラム入出力静的決定部３３２＞
図８は、図３に示したバッチプログラム入出力静的決定部３３２の入出力関係を示す説明図である。バッチプログラム入出力静的決定部３３２は、ストリーム処理基盤３２１上でＣＰＵ３１１により実行されるプログラムであり、バッチプログラム６００の静的な入出力設定を決定する。バッチプログラム入出力静的決定部３３２は、第１の静的決定部８０４を有する。
【００４７】
第１の静的決定部８０４は、クライアント３０１から、プログラム構成８０１、プラットフォーム要件８０２、およびバッチ実行仕様８０３といった登録情報を受け付ける。そして、第１の静的決定部８０４は、バッチプログラム６００の静的な入力データサイズおよび重なり幅を決定する。決定された入力データサイズおよび重なり幅は、バッチプログラム入出力設定として出力される。入力データサイズおよび重なり幅については、後述する。
【００４８】
＜プログラム構成８０１＞
図９は、図８に示したプログラム構成８０１の一例を示す説明図である。プログラム構成８０１とは、プログラムの動作を構成するパラメータが設定される情報である。パラメータとしては、たとえば、ウィンドウ幅９０１とスライド数９０２があり、クライアント３０１を操作することでユーザにより指定される。
【００４９】
ウィンドウ幅９０１は、ストリームプログラム４００やバッチプログラム６００の処理に必要とする時系列データを含むウィンドウの幅を示す。ウィンドウの幅とは、すなわち、ウィンドウ内に含まれる時系列データの個数である。スライド数９０２は、処理毎にウィンドウをスライドさせるサイズである。たとえば、図４に示したストリームプログラム４００では、ノイズ除去クエリ４０３が直近４個の計測値の平均値を１つずつずらして算出し続けるため、ウィンドウ幅９０１は４個、スライド数９０２は１個となる。
【００５０】
また、図５に示したバッチプログラム６００では、関数ＳＭＯＯＴＨＩＮＧにより直近３個の計測値の重み付き平均を求め、また関数ＤＥＲＩＶＡＴＩＯＮにより現在値と一つ前の値から微分値を算出する。したがって、関数ＳＭＯＯＴＨＩＮＧと関数ＤＥＲＩＶＡＴＩＯＮを含む前処理関数６０２では、合計してウィンドウ幅９０１は４個となる。また、関数ＤＥＲＩＶＡＴＩＯＮでは、ベクトルデータＶＤの要素をサンプリングし５０％削減するため、スライド数９０２は２個となる。
【００５１】
＜プラットフォーム要件８０２＞
図１０は、図８に示したプラットフォーム要件８０２の一例を示す説明図である。プラットフォーム要件８０２は、ストリーム処理基盤３２１に課される条件である。パラメータとしては、たとえば、レスポンス時間１００１があり、クライアント３０１を操作することでユーザにより指定される。レスポンス時間１００１は、データがストリーム処理サーバ３０３に入力してから、そのデータの処理が完了するまでの、ユーザが許容できる時間である。図１０では、レスポンス時間１００１は「１６秒」と指定されているため、データの入力からそのデータの処理完了までの時間が１６秒まで許容される。
【００５２】
＜バッチ実行仕様８０３＞
図１１は、図８に示したバッチ実行仕様８０３の一例を示す説明図である。バッチ実行仕様８０３とは、バッチ処理の実行方法を規定する情報である。パラメータとして、たとえば、入力レート１１０１および処理スループット１１０２があり、クライアント３０１を操作することでユーザにより指定される。入力レート１１０１は、バッチプログラム６００が入力とするストリームデータが到着する間隔を示す。図１１では入力レート１１０１は１個／秒であるため、毎秒１個、ストリームデータが到着することを示す。また、処理スループット１１０２は、バッチプログラム６００が単位時間当たりに処理する、ベクトルデータＶＤの要素数を示す。図１１では、処理スループット１１０２は１個／秒であるため、バッチプログラム６００が毎秒１個の要素を処理できることを示す。
【００５３】
＜バッチプログラム入出力設定動的決定部＞
図１２は、図３に示したバッチプログラム入出力動的決定部３３３の入出力関係を示す説明図である。バッチプログラム入出力動的決定部３３３は、ストリーム処理基盤３２１上でＣＰＵ３１１により実行されるプログラムであり、バッチプログラム６００の動的な入出力設定を決定する。バッチプログラム入出力動的決定部３３３は、バッチ実行モニタリング部１２０１と、第１の動的決定部１２０３とを有する。
【００５４】
バッチ実行モニタリング部１２０１は、実行中のバッチプログラム６００を監視し、バッチ実行モニタリング値１２０２を生成する。バッチ実行モニタリング値１２０２とは、実行中のバッチプログラム６００における観測値である。バッチ実行モニタリング値１２０２については、後述する。
【００５５】
第１の動的決定部１２０３は、クライアント３０１から、図９に示したプログラム構成８０１、図１０に示したプラットフォーム要件８０２およびバッチ実行モニタリング値１２０２を受け付ける。そして、第１の動的決定部１２０３は、バッチプログラム６００の動的な入力データサイズおよび重なり幅を決定する。決定された入力データサイズおよび重なり幅は、バッチプログラム入出力設定８０５として出力される。入力データサイズおよび重なり幅については、後述する。
【００５６】
＜バッチ実行モニタリング値１２０２＞
図１３は、バッチ実行モニタリング値１２０２の一例を示す説明図である。バッチ実行モニタリング値１２０２は、パラメータとして、処理対象データ数１３０１および処理スループット１３０２を有し、バッチ実行モニタリング部１２０１により出力される。処理対象データ数１３０１は、ストリーム格納キューＱに格納される、バッチプログラム６００が入力とするストリームデータの数を示す。図１３では処理対象データ数１３０１が「６」であるため、ストリーム格納キューＱに６個のストリームデータがあることを示す。また処理スループット１３０２はバッチプログラム６００が単位時間当たりに処理する、ベクトルデータＶＤの値のサイズを示す。
【００５７】
＜バッチプログラム入出力設定８０５＞
図１４は、図８および図１２に示したバッチプログラム入出力設定８０５の一例を示す説明図である。バッチプログラム入出力設定８０５とは、バッチプログラム６００に入出力されるデータを規定する情報である。パラメータとして、たとえば、入力データサイズ１４０１および重なり幅１４０２があり、クライアント３０１を操作することでユーザにより指定される。入力データサイズ１４０１は、バッチプログラム６００が入力するベクトルデータＶＤの要素数を示す。
【００５８】
たとえば、図７に示したベクトルデータＶＤの場合は、インデックス０から７の要素７００〜７０７が存在するため、ベクトルデータＶＤの要素数は８個となる。また、重なり幅１４０２は、現在のバッチプログラム６００が入力するベクトルデータＶＤと、一つ前のバッチプログラム６００が入力するベクトルデータＶＤで重複する要素数を示す。たとえば、図７に示したベクトルデータＶＤをバッチプログラム６００が入力する場合に、一つ前のバッチプログラム６００が入力するベクトルデータＶＤにも、インデックス０の要素７０１およびインデックス１の要素７０２が含まれている場合には、重なり幅１４０２は２個となる。
【００５９】
＜バッチプログラム実行部３３５＞
図１５は、図３に示したバッチプログラム実行部３３５の入出力の関係を示す説明図である。バッチプログラム実行部３３５は、入力データ・ストリームＴＯベクトル変換部１５０１および出力データ・ベクトルＴＯストリーム変換部１５０２を有する。入力データ・ストリームＴＯベクトル変換部１５０１は、バッチプログラム入出力設定８０５を入力する。バッチプログラム入出力設定８０５は、第１の静的決定部８０４や、第１の動的決定部１２０３が生成しても、ユーザにより手動で作成してもよい。
【００６０】
そして、入力データ・ストリームＴＯベクトル変換部１５０１は、ストリーム格納キューＱおよび重なりデータ格納領域１５００から複数のストリームデータ列ＳＤ１、ＳＤ２を入力し、バッチプログラム入出力設定８０５に従ってストリームデータ列ＳＤ１、ＳＤ２からベクトルデータＶＤ１に変換する。重なりデータ格納領域１５００とは、最新の重なり幅１４０２となるストリームデータ列ＳＤ２が格納される領域である。詳細については後述する。ストリーム格納キューＱのストリームデータ列ＳＤ１は、ストリームプログラム４００が生成しても、その他のプログラムが生成してもよい。
【００６１】
バッチプログラム６００は、入力データ・ストリームＴＯベクトル変換部１５０１が出力したベクトルデータＶＤ１を入力し、その処理結果としてベクトルデータＶＤ２を出力する。そして、出力データ・ベクトルＴＯストリーム変換部１５０２が、バッチプログラム６００が出力したベクトルデータＶＤ２を入力し、ストリームデータ列ＳＤ３に変換する。出力データ・ベクトルＴＯストリーム変換部１５０２が出力したストリームデータ列ＳＤ３は、ストリーム格納キューＱに格納される。続いて、ストリーム格納キューＱのストリームデータ列ＳＤ３は、ストリームプログラム４００が入力してもよく、その他のプログラムが入力してもよい。
【００６２】
図１６は、重なりデータ格納領域１５００の一例を示す説明図である。重なりデータ格納領域１５００には、次のバッチプログラムが入力するベクトルデータと、前のバッチプログラム６００が入力するベクトルデータとの間で、重複して用いるストリームデータが格納される。図１６では重なりデータ格納領域１５００に、時刻「０：５８」、計測値「１１：０」のストリームデータ１６０１、時刻「０：５９」、計測値「１４．０」のストリームデータ１６０１が格納される。入力データ・ストリームＴＯベクトル変換部１５０１が、重なりデータ格納領域１５００で保持しているストリームデータを入力し、ベクトルデータを生成する。
【００６３】
＜バッチプログラム入出力静的決定部３３２による処理手順＞
図１７は、バッチプログラム入出力静的決定部３３２による処理手順例を示すフローチャートである。第１の静的決定部８０４は、まず、ユーザが指定したプログラム構成８０１、プラットフォーム要件８０２、およびバッチ実行仕様８０３を読込む（Ｓ１７０１）。つぎに、第１の静的決定部８０４は、重なり幅１４０２を「ウィンドウ幅−スライド数」としバッチプログラム入出力設定８０５にセットする（Ｓ１７０２)。
【００６４】
ここで、バッチプログラム６００の入力となるストリームデータを格納するストリーム格納キューＱの先頭データがバッチプログラム６００で実行される迄の時間を待ち時間とし、バッチプログラム６００が実行されている時間を実行時間とする。第１の静的決定部８０４は、待ち時間＋実行時間がレスポンス時間１００１以下であれば、要求したレスポンス時間１００１を満たすことができる。
【００６５】
待ち時間は「ストリーム格納キューＱのデータ数（以下、キューデータ数）／入力レート」であり、実行時間は「キューデータ数／処理スループット」である。したがって、「キューデータ数／入力レート＋キューデータ数／処理スループット」がレスポンス時間以下となる必要がある。ストリーム格納キューＱにおける処理可能なデータ数（以下、処理可能データ数）は、「キューデータ数／入力レート＋キューデータ数／処理スループット≦レスポンス時間」を満たす、最大のキューデータ数となる。
【００６６】
このため、処理可能データ数は、［レスポンス時間×処理スループット×入力レート／（処理スループット＋入力レート）]となる（ステップＳ１７０３）。なお、［］はガウス記号である。
【００６７】
処理可能データ数がウィンドウ幅９０１以上の場合には（Ｓ１７０４：Ｙｅｓ）、第１の静的決定部８０４は、入力データサイズ１４０１を処理可能データ数として、バッチプログラム入出力設定８０５にセットする（ステップＳ１７０５）。これにより、レスポンス時間１００１の要件を満たしつつ入力データサイズ１４０１を最大化することができる。一方、処理可能データ数がウィンドウ幅９０１より小さい場合には（ステップＳ１７０４：Ｎｏ）、第１の静的決定部８０４は、ウィンドウ幅９０１より要素数が少ないベクトルデータＶＤをバッチプログラム６００は処理可能でないため、入力データサイズ１４０１をウィンドウ幅９０１とし、算出した入力データサイズ１４０１、重なり幅１４０２をバッチプログラム入出力設定８０５にセットする（Ｓ１７０６）。
【００６８】
たとえば、図９に示すようにウィンドウ幅９０１が４個、スライド数９０２が２個、また図１０に示すようにレスポンス時間１００１が１６秒、また図１１に示すように入力レート１１０１が１個／秒、処理スループット１１０２が１個／秒の場合には、処理可能データ数が１６［秒］×１［個／秒］×１［個／秒］／（１［個／秒］＋１［個／秒］）より８個となる。したがって、ウィンドウ幅９０１が４個であるため、ウィンドウ幅９０１よりも処理可能データ数が大きくなり、入力データサイズ１４０１は処理可能データ数である８個となる。また、重なり幅１４０２は「ウィンドウ幅９０１−スライド数９０２」より、４［個］−２［個］＝２個となる。このようにして、図１４に示したバッチプログラム入出力設定８０５が生成される。
【００６９】
＜バッチ実行モニタリング部１２０１による処理手順＞
図１８は、バッチ実行モニタリング部１２０１による処理手順例を示すフローチャートである。バッチ実行モニタリング部１２０１は、バッチプログラム６００の入力となるストリームデータを格納するストリーム格納キューＱの現在のデータ数を取得し、バッチ実行モニタリング値１２０２を処理対象データ数１３０１にセットする（Ｓ１８０１）。つぎに、バッチ実行モニタリング部１２０１は、ストリーム処理基盤３２１のログから処理スループット１１０２を取り出し、バッチ実行モニタリング値１２０２の処理スループット１１０２にセットする（Ｓ１８０２）。そして、バッチ実行モニタリング部１２０１は、ストリーム処理基盤３２１が終了していなければ（ステップＳ１８０３：Ｎｏ）、ステップＳ１８０１に戻り、終了していれば（ステップＳ１８０３：Ｙｅｓ）、処理を終了する。
【００７０】
＜第１の動的決定部１２０３による処理手順＞
図１９は、第１の動的決定部１２０３による処理手順例を示すフローチャートである。第１の動的決定部１２０３は、まずプログラム構成８０１およびプラットフォーム要件８０２を読み込む（Ｓ１９０１）。つぎに、第１の動的決定部１２０３は、重なり幅１４０２を「ウィンドウ幅９０１−スライド数」とし、バッチプログラム入出力設定８０５にセットする（Ｓ１９０２)。
【００７１】
そして、第１の動的決定部１２０３は、処理対象のストリームデータがストリーム格納キューＱに入力されるのを待ち受ける（ステップＳ１９０３：Ｎｏ）。処理対象のストリームデータがストリーム格納キューＱに存在する場合（ステップＳ１９０３：Ｙｅｓ）、第１の動的決定部１２０３は、バッチ実行モニタリング値１２０２を読込む（Ｓ１９０４）。そして、第１の動的決定部１２０３は、レスポンス時間１００１、処理スループット１１０２、現在時刻、ストリーム格納キューＱのデータの最古時刻から、レスポンス時間１００１の要件を満たす最大のストリームデータ数（以下、「処理可能データ数」）を「処理スループット×（レスポンス時間−（現在時刻−処理対象データの最古時刻））」とする（Ｓ１９０５）。
【００７２】
このあと、処理可能データ数がウィンドウ幅９０１以下の場合（ステップＳ１９０６：Ｙｅｓ）、第１の動的決定部１２０３は、バッチプログラム６００はウィンドウ幅９０１より要素数が少ないベクトルデータＶＤを処理可能でないため、入力データサイズ１４０１をウィンドウ幅９０１とし、バッチプログラム入出力設定８０５にセットする（Ｓ１９０７）。そして、ステップＳ１９１１に移行する。
【００７３】
一方、処理可能データ数がウィンドウ幅９０１より大きい場合（ステップＳ１９０６：Ｎｏ）、第１の動的決定部１２０３は、処理可能データ数が処理対象データ数１３０１＋重なり幅１４０２以下であるか否かを判断する（ステップＳ１９０８）。処理可能データ数が処理対象データ数＋重なり幅以下である場合（ステップＳ１９０８：Ｙｅｓ）、第１の動的決定部１２０３は、入力データサイズ１４０１を処理可能データ数とし、バッチプログラム入出力設定８０５にセットする（Ｓ１９０９）。そして、ステップＳ１９１１に移行する。
【００７４】
一方、処理可能データ数が処理対象データ数＋重なり幅以下でない場合（ステップＳ１９０８：Ｎｏ）、第１の動的決定部１２０３は、入力データサイズ１４０１を、「処理可能データ数＋重なり幅１４０２」とし、バッチプログラム入出力設定８０５にセットする（Ｓ１９１０）。そして、ステップＳ１９１１に移行する。
【００７５】
ステップＳ１９１１では、第１の動的決定部１２０３は、ストリーム処理基盤３２１が終了したか否かを判断し（ステップＳ１９１１）、終了していない場合（ステップＳ１９１１：Ｎｏ）、ステップＳ１９０３に戻る。一方、終了した場合（ステップＳ１９１１：Ｙｅｓ）、第１の動的決定部１２０３による処理を終了する。
【００７６】
＜入力データ・ストリームＴＯベクトル変換部１５０１による処理手順＞
図２０は、入力データ・ストリームＴＯベクトル変換部１５０１による処理手順例を示すフローチャートである。入力データ・ストリームＴＯベクトル変換部１５０１は、バッチプログラム入出力設定を読込む（Ｓ２００１）。つぎに、入力データ・ストリームＴＯベクトル変換部１５０１は、ストリーム格納キューＱに、入力データサイズ１４０１から重なり幅１４０２を引いた数以上のストリームデータが存在するか否かを判断する（ステップＳ２００２）。
【００７７】
入力データサイズ１４０１から重なり幅１４０２を引いた数以上のストリームデータが存在しない場合（ステップＳ２００２：Ｎｏ）、ステップＳ２００１に戻り、ストリームデータが溜まるまで待ち受ける。入力データサイズ１４０１から重なり幅１４０２を引いた数以上のストリームデータが存在する場合（ステップＳ２００２：Ｙｅｓ）、入力データ・ストリームＴＯベクトル変換部１５０１は、入力データサイズ１４０１から重なり幅１４０２を引いた数のストリームデータをストリーム格納キューＱから取得する（Ｓ２００３）。
【００７８】
そして、入力データ・ストリームＴＯベクトル変換部１５０１は、重なりデータ格納領域１５００からストリームデータを取得する（Ｓ２００４）。入力データ・ストリームＴＯベクトル変換部１５０１は、ストリーム格納キューＱおよび重なりデータ格納領域１５００から取得したストリームデータをベクトルデータＶＤに変換し（Ｓ２００５）、そのベクトルデータＶＤを入力としてバッチプログラム６００を起動する（Ｓ２００６）。その後、入力データ・ストリームＴＯベクトル変換部１５０１は、ストリーム格納キューＱおよび重なりデータ格納領域１５００から取得したストリームデータのうち、より時刻が新しい重なり幅１４０２の数のストリームデータを重なりデータ格納領域１５００に格納する（Ｓ２００７）。
【００７９】
このあと、入力データ・ストリームＴＯベクトル変換部１５０１は、ストリーム処理基盤３２１が終了したか否かを判断し（ステップＳ２００８）、終了していない場合（ステップＳ２００８：Ｎｏ）、ステップＳ２００２に戻る。一方、終了した場合（ステップＳ２００８：Ｙｅｓ）、入力データ・ストリームＴＯベクトル変換部１５０１による処理を終了する。
【００８０】
＜ストリームデータからベクトルデータＶＤへの変換例＞
図２１は、ストリームデータからベクトルデータＶＤへの変換例を示す説明図である。図２１では、図２０のステップ番号を参照して説明する。ステップＳ２００１において、入力データ・ストリームＴＯベクトル変換部１５０１は、入力データサイズ１４０１が８個で重なり幅１４０２が２個であるバッチプログラム入出力設定８０５を読込む。
【００８１】
ステップＳ２００２において、入力データ・ストリームＴＯベクトル変換部１５０１は、ストリーム格納キューＱに、入力データサイズ１４０１から重なり幅１４０２を引いた数以上のストリームデータが存在するか否かを判断する。入力データサイズ１４０１（８個）から重なり幅１４０２（２個）を引いた数は、８−２＝６である。ストリーム格納キューＱには、時刻１：００〜１：１３までの１４個のストリームデータ５００〜５１３が格納されているため、入力データサイズ１４０１（８個）から重なり幅１４０２（２個）を引いた数（６）以上のストリームデータが格納されている。
【００８２】
したがって、ステップＳ２００３において、入力データ・ストリームＴＯベクトル変換部１５０１は、時刻１：００〜１：０５までの５個のストリームデータ５０１〜５０５を、ストリーム格納キューＱから取得する。
【００８３】
また、ステップＳ２００４において、入力データ・ストリームＴＯベクトル変換部１５０１は、重なりデータ格納領域１５００から時刻０：５８および０：５９のストリームデータ１６０１，１６０２を取得する。そして、ステップＳ２００５において、入力データ・ストリームＴＯベクトル変換部１５０１は、時刻０：５８および０：５９のストリームデータ１６０１，１６０２と、時刻１：００〜１：０５までの６個のストリームデータ５０１〜５０５とを、インデックス０〜７の要素７００〜７０７を持つベクトルデータＶＤ１に変換する。
【００８４】
また、ステップＳ２００７において、入力データ・ストリームＴＯベクトル変換部１５０１は、取得した時刻０：５９〜１：０５までの８個のストリームデータのうち、より時刻が新しい重なり幅１４０２：２個分のストリームデータを選択する。この場合、時刻１：０４および１：０５の２個のストリームデータが選択される。
【００８５】
そして、入力データ・ストリームＴＯベクトル変換部１５０１は、時刻１：０４および１：０５の２個のストリームデータを、重なりデータ格納領域１５００に上書き保存する。これにより、重なりデータ格納領域１５００には、時刻０：５８および０：５９のストリームデータに替わって、時刻１：０４および１：０５のストリームデータが格納される。したがって、ステップＳ２００３であらたにストリームデータが取得されると、ステップＳ２００４で、重なりデータ格納領域１５００から時刻１：０４および１：０５のストリームデータが取得されることになる。
【００８６】
＜出力データ・ベクトルＴＯストリーム変換部１５０２による処理手順＞
図２２は、出力データ・ベクトルＴＯストリーム変換部１５０２による処理手順例を示すフローチャートである。出力データ・ベクトルＴＯストリーム変換部１５０２は、バッチプログラム６００が出力するベクトルデータＶＤを取得する（Ｓ２２０１）。つぎに、出力データ・ベクトルＴＯストリーム変換部１５０２は、ベクトルデータＶＤから要素を順次取得し、取得した要素に時刻を付加してストリームデータを生成する（ステップＳ２２０２）。
【００８７】
そして、出力データ・ベクトルＴＯストリーム変換部１５０２は、生成したストリームデータを時刻順にストリーム格納キューＱに格納する（Ｓ２２０３）。このあと、出力データ・ベクトルＴＯストリーム変換部１５０２は、ストリーム処理基盤３２１が終了したか否かを判断し（ステップＳ２２０４）、終了していない場合（ステップＳ２２０４：Ｎｏ）、ステップＳ２２０１に戻る。一方、終了した場合（ステップＳ２２０４：Ｙｅｓ）、出力データ・ベクトルＴＯストリーム変換部１５０２による処理を終了する。
【００８８】
＜ベクトルデータＶＤからストリームデータへの変換例＞
図２３は、ベクトルデータＶＤからストリームデータへの変換例を示す説明図である。図２３では、図２２のステップ番号を参照して説明する。ステップＳ２２０１において、出力データ・ベクトルＴＯストリーム変換部１５０２は、インデックス０〜２の要素を持つベクトルデータＶＤ２を取得する。
【００８９】
そして、ステップＳ２２０２およびＳ２２０３において、出力データ・ベクトルＴＯストリーム変換部１５０２は、要素に対応する時刻１：０１、１：０３，１：０５のストリームデータ２３１１，２３１３，２３１５を生成し、ストリーム格納キューＱに格納する。これにより、後段のストリームプログラム４００は、ストリーム格納キューＱに格納されたストリームデータ２３１１，２３１３，２３１５を取得して、ストリーム処理を実行することができる。
【００９０】
このように、実施例１によれば、ベクトルデータ間で重なりを持たせることができるため、計算実行不可という状態を回避することができ、バッチプログラムのセマンティックスを保持することができる。したがって、バッチプログラムのコードやアルゴリズムを変更することなく、ストリーム処理基盤３２１上でバッチプログラム６００を実行することができる。また、重なり幅１４０２分のデータだけが重複するように、ベクトルデータＶＤのデータサイズが決定される。このように、重なり幅１４０２を超えるベクトルデータＶＤの生成を抑制することができるため、処理負荷の軽減を図ることができる。
【００９１】
また、ストリーム処理基盤３２１上でバッチプログラム６００の実行後、実行結果であるストリームデータ群を纏めてベクトルデータに変換するため、ストリーム処理基盤３２１上で実行される後段のストリームデータに入力データとして与えることができ、ストリーム処理基盤３２１上でのストリーム処理の効率化を図ることができる。
【００９２】
（実施例２）
つぎに、実施例２について説明する。実施例２は、バッチ処理基盤上でストリームプログラム４００を実行する例である。なお、実施例１と同一構成には同一符号を付し、その説明を省略する。
【００９３】
図２４および図２５は、バッチ処理基盤上でストリームプログラムＳＰを実行する例を示す説明図である。図２４は、データの重なりを持たせない場合実行例である。図２４では、ストリームプログラムＳＰは、ウィンドウ幅が６０個、スライド数が１個となるプログラム構成とする。なお、時刻の単位は、一例として「分」とする。また、バッチ処理基盤は、一例として４時間ごとにバッチ処理を実行するものとする。
【００９４】
バッチ処理基盤は、ファイルＦ内の時刻ごとの値を時刻単位のストリームデータに変換するバッチ処理基盤のベクトルＴＯストリーム変換２４００を実行する。変換されたストリームデータ列２４０１は、ストリームプログラムＳＰに入力される。ストリームプログラムＳＰは、入力されてくるストリームデータ列２４０１を１個ずつスライドさせながら用いて所定の処理を実行する。
【００９５】
データに重なりを持たせないため、時刻４：５９での変換後、８：５９にバッチ処理をする場合、バッチ処理基盤は、前回である時刻４：５９でのデータとは重ならないように、ベクトルＴＯストリーム変換２４００を実行する。すなわち、時刻８：５９では、バッチ処理基盤は、時刻５：００〜８：５９までの時刻の値をベクトルＴＯストリーム変換することにより、ストリームデータ列２４０２を生成する。
【００９６】
ここで、時刻５：００のストリームデータは、時刻８：５９でのベクトルＴＯストリーム変換における先頭データである。したがって、時刻５：００のストリームデータがストリームプログラムＳＰに入力された場合、ストリームプログラムＳＰは、時刻４：０１〜４：５９の５９個のストリームデータがないため、時刻５：００のストリームデータについての所定の処理を実行できない。したがって、ストリームプログラムＳＰが、時刻５：００のストリームデータを処理する場合、直前の５９個のストリームデータを与えるか、または、時刻４：５９でのストリームデータの計算状態を保持しておく必要がある。
【００９７】
図２５は、データの重なりを持たせた場合の実行例である。ストリームプログラムＳＰのプログラム構成は、図２４と同一である。また、ストリームプログラムＳＰのプラットフォーム要件は、４８０分とする。
【００９８】
バッチ処理基盤は、プログラム構成とプラットフォーム要件とに基づいて、重なり幅または計算状態保持の有無を決定する。バッチ処理基盤は、重なり幅と計算状態保持のいずれを適用するかは、計算処理量を比較した上で選択することになる。重なり幅が適用される場合、バッチ処理基盤は、ベクトルＴＯストリーム変換２４００により、重なり幅分のデータを含めてストリームデータに変換する。
【００９９】
時刻８：５９の場合、図２４では、ベクトルＴＯストリーム変換２４００は、時刻５：００〜８：５９のストリームデータ列２４０２を生成したが、図２５では、ベクトルＴＯストリーム変換２４００は、時刻５：００の直前の重なり幅５９個分のストリームデータを含む時刻４：０１〜８：００のストリームデータ列２５０１を生成する。なお、生成されなかった時刻８：０１〜８：５９のストリームデータについては、つぎのバッチ処理のタイミングで生成される。
【０１００】
また、計算状態保持が適用される場合、時刻４：５９でのストリームプログラムＳＰの計算状態が保持される。また、ベクトルＴＯストリーム変換２４００は、時刻８：５９において、図２４と同様、時刻５：００〜８：５９のストリームデータ２５０２を生成し、ストリームプログラムＳＰに出力する。ストリームプログラムＳＰは、時刻４：５９でのストリームプログラムＳＰの計算状態と、時刻５：００〜８：５９のストリームデータ列２５０２と、を用いて、所定の処理を実行する。
【０１０１】
このように、前回のバッチ処理時におけるストリーム処理の実行結果を用いることにより、実質的にストリームデータ間で重なりを持たせることができる。したがって、図２４の例のような計算実行不可という状態を回避することができ、ストリームプログラム４００のセマンティックスを保持することができる。
【０１０２】
＜システム構成例＞
図２６は、バッチ処理システムの一例を示すシステム構成図である。バッチ処理システム２６００は、クライアント３０１と、データソース３０２と、バッチ処理サーバ２６０３と、が、ネットワーク３０４を介して通信可能に接続された構成である。ネットワーク３０４は、イーサネット（登録商標）、ＬＡＮ、またはＷＡＮでも差し支えない。また、クライアント３０１、データソース３０２、およびストリーム処理サーバ３０３は、ＰＣ、ブレード型の計算機システムなどの任意のコンピュータシステムでよい。
【０１０３】
クライアント３０１は、バッチ処理サーバ２６０３に対し登録処理を実行する計算機である。登録処理の詳細については後述する。
【０１０４】
データソース３０２は、バッチ処理サーバ２６０３に、処理対象となる一連の時系列データを供給する供給源であり、たとえば、上述した工場のプラントやサーバが挙げられる。
【０１０５】
バッチ処理サーバ２６０３は、Ｉ／Ｏインターフェース２６１３、ＣＰＵ２６１１、メモリ２６１２およびストレージ２６１４が、バス２６１５で結合された計算機である。バッチ処理サーバ２６０３は、Ｉ／Ｏインターフェース２６１３を介してネットワーク３０４にアクセスする。また、バッチ処理サーバ２６０３は、処理結果、処理の中間結果、システム動作に必要な設定データを、不揮発性のストレージ２６１４に格納することができる。ストレージ２６１４は、Ｉ／Ｏインターフェース２６１３を介して直接接続されるが、バッチ処理サーバ２６０３外において、Ｉ／Ｏインターフェース２６１３によりネットワーク３０４を介して接続されることとしてもよい。
【０１０６】
メモリ２６１２には、バッチ処理基盤２６２１がマッピングされる。バッチ処理基盤２６２１は、１以上のバッチプログラムであるバッチプログラム群３３４の起動、停止モジュールやスケジューリングモジュールなど一般的なストリーム処理のモジュールがマッピングされたミドルウェアである。このほかに、バッチ処理基盤２６２１には、ストリームプログラム入出力設定静的決定部２６３２、ストリームプログラム入出力設定動的決定部２６３３、１以上のストリームプログラムであるストリームプログラム群３３１を含むストリームプログラム実行部２６３５がマッピングされる。
【０１０７】
＜ストリームプログラム入出力設定静的決定部２６３２＞
図２７は、図２６に示したストリームプログラム入出力設定静的決定部２６３２の入出力関係を示す説明図である。ストリームプログラム入出力設定静的決定部２６３２は、バッチ処理基盤２６２１上でＣＰＵ２６１１により実行されるプログラムであり、ストリームプログラム４００の静的な入出力設定を決定する。ストリームプログラム入出力設定静的決定部２６３２は、第２の静的決定部２７０２を有する。
【０１０８】
第２の静的決定部２７０２は、クライアント３０１から、プログラム構成８０１、プラットフォーム要件８０２、およびストリーム実行仕様２７０１といった登録情報を受け付ける。そして、第２の静的決定部２７０２は、ストリームプログラム４００の静的な入力データサイズ、重なり幅および計算状態保持の有無を決定する。計算状態保持とは、バッチ処理基盤２６２１上で実行されるストリームプログラム４００の実行結果である計算状態を保持することである。決定された入力データサイズおよび重なり幅は、ストリームプログラム入出力設定２７０３として出力される。
【０１０９】
＜ストリーム実行仕様２７０１＞
図２８は、ストリーム実行仕様２７０１の一例を示す説明図である。ストリーム実行仕様２７０１とは、ストリーム処理の実行方法を規定する情報である。パラメータとして、たとえば、入力レート２８０１、処理スループット２８０２、計算状態保持・読出し時間２８０３があり、クライアント３０１を操作することでユーザにより指定される。入力レート２８０１は、ストリームプログラム４００が入力とするベクトルデータＶＤの要素が到着する間隔を示す。
【０１１０】
図２８では、入力レート２８０１は１個／分であるため、毎分１個、ベクトルデータＶＤの要素が到着することを示す。また、処理スループット２８０２は、ストリームプログラム４００が単位時間当たりに処理する、ストリームデータの数を示す。図２８では処理スループット２８０２は１個／分であるため、ストリームプログラム４００が毎分１個の値を処理できることを示す。計算状態保持・読出し時間２８０３は、計算状態の保持と読み出しに要する時間を示す。図２８では、計算状態保持・読出し時間２８０３は５分であるため、計算状態の保持と読み出しに５分かかることを示す。
【０１１１】
＜ストリームプログラム入出力設定動的決定部２６３３＞
図２９は、図２６に示したストリームプログラム入出力設定動的決定部２６３３の入出力関係を示す説明図である。ストリームプログラム入出力設定動的決定部２６３３は、バッチ処理基盤２６２１上でＣＰＵ２６１１により実行されるプログラムであり、ストリームプログラム４００の動的な入出力設定を決定する。ストリームプログラム入出力設定動的決定部２６３３は、ストリーム実行モニタリング部２９０１と、第２の動的決定部２９０３とを有する。
【０１１２】
ストリーム実行モニタリング部２９０１は、実行中のストリームプログラム４００を監視し、ストリーム実行モニタリング値２９０２を生成する。ストリーム実行モニタリング値２９０２とは、実行中のバッチプログラム６００における観測値である。ストリーム実行モニタリング値２９０２については、後述する。
【０１１３】
第２の動的決定部２９０３は、クライアント３０１から、図９に示したプログラム構成８０１、図１０に示したプラットフォーム要件８０２およびストリーム実行モニタリング値２９０２を受け付ける。そして、第２の動的決定部２９０３は、ストリームプログラム４００の動的な入力データサイズ、重なり幅および計算状態の有無を決定する。決定された入力データサイズ１４０１および重なり幅１４０２は、ストリームプログラム入出力設定２７０３として出力される。入力データサイズおよび重なり幅については、後述する。
【０１１４】
＜ストリーム実行モニタリング値２９０２＞
図３０は、ストリーム実行モニタリング値２９０２の一例を示す説明図である。ストリーム実行モニタリング値２９０２は、パラメータとして、処理対象データ数３００１、処理スループット３００２、および計算状態保持・読出し時間３００３を有し、ストリーム実行モニタリング部２９０１により出力される。処理対象データ数３００１は、ストリームプログラム４００が入力とするベクトルデータＶＤの要素数を示す。当該要素数は、たとえば、ファイルに格納されている。
【０１１５】
図３０では、処理対象データ数３００１が２４０個であるため、ファイルにベクトルデータＶＤの要素数が２４０個であることを示す。また、処理スループット３００２は、ストリームプログラム４００が単位時間当たりに処理するストリームデータの数を示す。計算状態保持・読出し時間３００３は、計算状態の保持と読み出しに要する時間を示す。
【０１１６】
＜ストリームプログラム入出力設定２７０３＞
図３１は、図２７および図２９に示したストリームプログラム入出力設定２７０３の一例を示す説明図である。ストリームプログラム入出力設定２７０３とは、ストリームプログラム４００に入出力されるデータを規定する情報である。パラメータとして、たとえば、入力データサイズ３１０１、重なり幅３１０２、計算状態保持有無３１０３があり、クライアント３０１を操作することでユーザにより指定される。入力データサイズ３１０１は、ストリームプログラム４００が入力するストリームデータのサイズを示す。
【０１１７】
たとえば、図３１に示した入力データサイズ３１０１は２４０個であるため、ストリームプログラム４００は、２４０個のストリームデータを入力する。また、重なり幅３１０２は、ストリームプログラム４００が入力するストリームデータと、一つ前の実行でストリームプログラム４００が入力したストリームデータとの間で、重複するストリームデータの数を示す。図３１では、重なり幅３１０２は３個であるため、一つ前の実行でストリームプログラム４００が入力したストリームデータと３個のストリームデータが重複することを示す。また、計算状態保持有無３１０３は、ストリームプログラム４００の計算状態を保持するか否かを示す。図３１では、計算状態保持有無３１０３は「なし」であるため、計算状態は保持されない。
【０１１８】
＜ストリームプログラム実行部２６３５＞
図３２は、図２６に示したストリームプログラム実行部２６３５の入出力の関係を示す説明図である。ストリームプログラム実行部２６３５は、入力データ・ベクトルＴＯストリーム変換部３２０１と、出力データ・ストリームＴＯベクトル変換部３２０２と、計算状態読出し部３２０３と、計算状態保持部３２０４と、を有する。
【０１１９】
入力データ・ベクトルＴＯストリーム変換部３２０１、計算状態読出し部３２０３、および計算状態保持部３２０４は、ストリームプログラム入出力設定２７０３を入力する。ストリームプログラム入出力設定２７０３は、第２の静的決定部２７０２や、第２の動的決定部２９０３が生成してもよく、ユーザにより手動で作成してもよい。
【０１２０】
計算状態読出し部３２０３は、ストリームプログラム４００の実行開始時に、計算状態格納領域３２１０に格納されている計算状態３２１１を読出し、ストリームプログラム入出力設定２７０３に従って、ストリームプログラム４００に入力する。計算状態保持部３２０４は、ストリームプログラム４００の実行終了時に、ストリームプログラム入出力設定２７０３に従って計算状態３２１１をストリームプログラム４００に入力する。
【０１２１】
入力データ・ベクトルＴＯストリーム変換部３２０１は、バッチプログラムＢＰ１の出力であるファイルＦ１内のベクトルデータＶＤ３を入力とし、ストリームプログラム入出力設定２７０３に従ってベクトルデータＶＤ３からストリームデータに変換する。入力データ・ベクトルＴＯストリーム変換部３２０１が入力するベクトルデータＶＤ３は、ファイル、およびデータベースやその他の記憶領域に格納してもよい。また、ファイルＦ１やその他の記憶領域に、バッチプログラム６００がベクトルデータＶＤ３を格納してもよく、その他のプログラムが格納してもよい。
【０１２２】
ストリームプログラム４００は、入力データ・ベクトルＴＯストリーム変換部３２０１が出力したストリームデータを入力し、その処理結果としてストリームデータを出力する。そして、出力データ・ストリームＴＯベクトル変換部３２０２が、ストリームプログラム４００が出力したストリームデータＳＤ４を入力し、ベクトルデータＶＤ４に変換する。出力データ・ストリームＴＯベクトル変換部３２０２が出力したベクトルデータＶＤは、ファイルＦ２やデータベースまたはその他の記憶領域に格納される。ファイルＦ２やその他の記憶領域に格納されたベクトルデータＶＤ４はバッチプログラム６００が入力してもよく、その他のプログラムが入力してもよい。
【０１２３】
＜重なりデータ時刻＞
図３３は、図３２に示した重なりデータ時刻の一例を示す説明図である。重なりデータ時刻ＯＴは、ストリームプログラム４００が入力するストリームデータの中で、一つ前の実行でストリームプログラム４００が入力するストリームデータと重複するストリームデータの時刻を示す。図３３では、重なりデータ時刻ＯＴは「０：５７〜０：５９」であるため、現在と一つ前のストリームプログラム４００のいずれの実行においても、時刻「０：５７」〜「０：５９」のストリームデータを入力として持つ。重なりデータ時刻ＯＴは、入力データ・ベクトルＴＯストリーム変換部３２０１により設定され、出力データ・ストリームＴＯベクトル変換部３２０２に使用される。
【０１２４】
＜オペレータツリー＞
図３４は、オペレータツリーの一例を示す説明図である。オペレータツリー３４００は、ＣＱＬで記述したストリームプログラム４００をコンパイルすることに生成される。ストリーム処理基盤３２１は、オペレータツリー３４００を構成する各オペレータ３４０１〜３４０４を、オペレータツリー３４００で指定された順に実行する。図３４に示すオペレータツリー３４００は、図４に示すノイズ除去クエリ４０３および異常センサクエリ４０４のコンパイルの結果、生成されたオペレータツリー３４００である。オペレータツリー３４００は、たとえば、ＲＯＷＳ３４０１、ＧＲＯＵＰ  ＢＹ３４０２、ＩＳＴＲＥＡＭ３４０３、ＩＳＴＲＥＡＭ３４０４により構成され、ＲＯＷＳ３４０１、ＧＲＯＵＰ  ＢＹ３４０２、ＩＳＴＲＥＡＭ３４０３、ＩＳＴＲＥＡＭ３４０４の順に実行される。
【０１２５】
＜計算状態格納領域３２１０＞
図３５は、図３２に示した計算状態格納領域３２１０の一例を示す説明図である。計算状態格納領域３２１０には、計算状態３２１１が格納される。計算状態３２１１は、各オペレータ３４０１〜３４０４の計算に用いる状態を示す。たとえば、ＲＯＷＳ３４０１の計算状態は、最近４個のストリームデータを保持するウィンドウであるため、４個のストリームデータを格納する。また、オペレータＧＲＯＵＰ  ＢＹ３４０２の計算状態３２１１は、最近４個の計測値の平均値を格納する。
【０１２６】
＜第２の静的決定部２７０２による処理手順＞
図３６は、第２の静的決定部２７０２による処理手順例を示すフローチャートである。第２の静的決定部２７０２は、まず、プログラム構成８０１、プラットフォーム要件８０２、およびストリーム実行仕様２７０１を読込む（ステップＳ３６０１）。
【０１２７】
つぎに、第２の静的決定部２７０２は、「（ウィンドウ幅−スライド数）／処理スループット」が計算状態保持・読出し時間２８０３よりも大きいか否かを判断する（ステップＳ３６０２）。大きい場合（ステップＳ３６０２：Ｙｅｓ）、第２の静的決定部２７０２は、ストリームプログラム入出力設定２７０３において計算状態保持有無３１０３を「あり」にセットし（ステップＳ３６０３）、ストリームプログラム入出力設定２７０３において重なり幅３１０２を０にセットする（ステップＳ３６０４）。そして、ステップＳ３６０７に移行する。
【０１２８】
一方、「（ウィンドウ幅−スライド数）／処理スループット」が計算状態保持・読出し時間２８０３以下の場合（ステップＳ３６０２：Ｎｏ）、第２の静的決定部２７０２は、ストリームプログラム入出力設定において計算状態保持有無３１０３を「なし」にセットし（ステップＳ３６０５）、また、ストリームプログラム入出力設定２７０３において重なり幅３１０２を「ウィンドウ幅−スライド数」にセットする（ステップＳ３６０６）。そして、ステップＳ３６０７に移行する。
【０１２９】
ここで、処理対象のベクトルデータＶＤにおいてストリームプログラム４００で実行する迄の時間を待ち時間、ストリームプログラム４００の実行時間を実行時間とする。待ち時間＋実行時間がレスポンス時間１００１以下であれば、要求したレスポンス時間１００１で処理することが可能となる。待ち時間は、「処理対象のベクトルデータＶＤのサイズ（以下、ベクトルサイズ）／入力レート」であり、また実行時間は「ベクトルサイズ／処理スループット」である。
【０１３０】
このため、「ベクトルサイズ／入力レート＋ベクトルサイズ／処理スループット」がレスポンス時間１００１以下となる必要がある。したがって、ベクトルデータＶＤの処理可能なデータサイズ（以下、「処理可能データ数」）は、「ベクトルサイズ／入力レート＋ベクトルサイズ／処理スループット≦レスポンス時間」を満たす、最大のベクトルサイズとなる。これにより、ベクトルサイズは、［レスポンス時間×処理スループット×入力レート／（処理スループット＋入力レート）］となる（［］はガウス記号）。
【０１３１】
したがって、第２の静的決定部２７０２は、入力データサイズ３１０１を、［レスポンス時間×処理スループット×入力レート／（処理スループット＋入力レート）］として、ストリームプログラム入出力設定２７０３にセットする（ステップＳ３６０７）。これにより、第２の静的決定部２７０２による処理を終了する。
【０１３２】
＜ストリーム実行モニタリング部２９０１による処理手順＞
図３７は、ストリーム実行モニタリング部２９０１による処理手順例を示すフローチャートである。ストリーム実行モニタリング部２９０１は、ストリームプログラム４００の入力となるストリームデータを格納するファイルを参照し、ストリーム実行モニタリング値２９０２を処理対象データ数３００１にセットする（ステップＳ３７０１）。
【０１３３】
つぎに、ストリーム実行モニタリング部２９０１は、バッチ処理基盤２６２１のログから処理スループットを取り出し、ストリーム実行モニタリング値２９０２の処理スループット３００２にセットする（ステップＳ３７０２）。そして、バッチ実行モニタリング部１２０１は、バッチ処理基盤２６２１が終了していなければ（ステップＳ３７０３：Ｎｏ）、ステップＳ３７０１に戻り、終了していれば（ステップＳ３７０３：Ｙｅｓ）、処理を終了する。
【０１３４】
＜第２の動的決定部２９０３による処理手順＞
図３８は、第２の動的決定部２９０３による処理手順例を示すフローチャートである。第２の動的決定部２９０３は、まず、プログラム構成８０１およびプラットフォーム要件８０２を読み込む（ステップＳ３８０１）。つぎに、第２の動的決定部２９０３は、処理対象のベクトルデータＶＤの要素がファイルに存在するか否かを判断する（ステップＳ３８０２）。処理対象のベクトルデータＶＤがファイルに存在する場合（ステップＳ３８０２：Ｙｅｓ）、第２の動的決定部２９０３は、ストリーム実行モニタリング値２９０２を読込む（ステップＳ３８０３）。
【０１３５】
つぎに、第２の動的決定部２９０３は、「（ウィンドウ幅−スライド数）／処理スループット」が計算状態保持・読出し時間３００３よりも大きいか否かを判断する（ステップＳ３８０４）。大きい場合（ステップＳ３８０４：Ｙｅｓ）、第２の動的決定部２９０３は、ストリームプログラム入出力設定２７０３において計算状態保持有無３１０３を「あり」にセットし（ステップＳ３８０５）、ストリームプログラム入出力設定２７０３において重なり幅３１０２を０にセットする（ステップＳ３８０６）。そして、ステップＳ３８０９に移行する。
【０１３６】
一方、「（ウィンドウ幅−スライド数）／処理スループット」が計算状態保持・読出し時間３００３以下の場合（ステップＳ３８０４：Ｎｏ）、第２の動的決定部２９０３は、ストリームプログラム入出力設定２７０３において計算状態保持有無３１０３を「なし」にセットし（ステップＳ３８０７）、また、ストリームプログラム入出力設定２７０３において重なり幅３１０２を「ウィンドウ幅−スライド数」にセットする（ステップＳ３８０８）。そして、ステップＳ３８０９に移行する。
【０１３７】
ここで、処理対象のベクトルデータＶＤにおいてストリームプログラム４００で実行する迄の時間を待ち時間、ストリームプログラム４００の実行時間を実行時間とする。待ち時間＋実行時間がレスポンス時間１００１以下であれば、要求したレスポンス時間１００１で処理することが可能となる。待ち時間は、「処理対象のベクトルデータＶＤのサイズ（以下、ベクトルサイズ）／入力レート」であり、また実行時間は「ベクトルサイズ／処理スループット」である。
【０１３８】
このため、「ベクトルサイズ／入力レート＋ベクトルサイズ／処理スループット」がレスポンス時間１００１以下となる必要がある。したがって、ベクトルデータＶＤの処理可能なデータサイズ（以下、「処理可能データ数」）は、「ベクトルサイズ／入力レート＋ベクトルサイズ／処理スループット≦レスポンス時間」を満たす、最大のベクトルサイズとなる。これにより、ベクトルサイズは、［レスポンス時間×処理スループット×入力レート／（処理スループット＋入力レート）］となる（［］はガウス記号）。
【０１３９】
したがって、第２の動的決定部２９０３は、入力データサイズ３１０１を、［レスポンス時間×処理スループット×入力レート／（処理スループット＋入力レート）］として、ストリームプログラム入出力設定２７０３にセットする（ステップＳ３８０９）。
【０１４０】
このあと、第２の動的決定部２９０３は、バッチ処理基盤２６２１が終了したか否かを判断し（ステップＳ３８１０）、終了していない場合（ステップＳ３８１０：Ｎｏ）、ステップＳ３８０２に戻る。一方、終了した場合（ステップＳ３８１０：Ｙｅｓ）、第２の動的決定部２９０３による処理を終了する。
【０１４１】
＜入力データ・ベクトルＴＯストリーム変換部３２０１による処理手順＞
図３９は、図３２に示した入力データ・ベクトルＴＯストリーム変換部３２０１による処理手順例を示すフローチャートである。入力データ・ベクトルＴＯストリーム変換部３２０１は、まず、ファイルの読出しインデックスを、「最後入力データのインデックス＋１−重なり幅」に設定する（ステップＳ３９０１）。最後入力データとは、最後にファイルから読み出されたベクトルデータＶＤの要素である。
【０１４２】
つぎに、入力データ・ベクトルＴＯストリーム変換部３２０１は、ファイルの読出しインデックスの要素の時刻から最後入力データのインデックスから１引いた要素の時刻までを、重なりデータ時刻ＯＴに設定する（ステップＳ３９０２）。
【０１４３】
そして、入力データ・ベクトルＴＯストリーム変換部３２０１は、読出しインデックスのベクトルデータＶＤの要素をファイルから取得し（ステップＳ３９０３）、その取得した要素に時刻を付加してストリームデータを生成する（ステップＳ３９０４）。そして、入力データ・ベクトルＴＯストリーム変換部３２０１は、ストリームデータをストリーム格納キューＱに格納する（ステップＳ３９０５）。
【０１４４】
そして、入力データ・ベクトルＴＯストリーム変換部３２０１は、取得した要素の数が入力データサイズより小さいか否かを判断する（ステップＳ３９０６）。小さい場合（ステップＳ３９０６：Ｙｅｓ）、入力データ・ベクトルＴＯストリーム変換部３２０１は、読出しインデックスを１つ加算し（ステップＳ３９０７）、ステップ３９０３に戻り、ステップＳ３９０３〜Ｓ３９０５を実行する。
【０１４５】
そして、取得したデータ数が入力データサイズ以上になった場合（ステップＳ３９０６：Ｎｏ）、入力データ・ベクトルＴＯストリーム変換部３２０１は、ファイル内の末尾のインデックスの要素を、最後入力データに設定し（ステップＳ３９０８）、入力データ・ベクトルＴＯストリーム変換部３２０１による処理を終了する。
【０１４６】
＜ベクトルデータＶＤからストリームデータへの変換例＞
図４０は、ベクトルデータＶＤからストリームデータへの変換例を示す説明図である。図４０では、図３９のステップ番号を参照して説明する。なお、この時点での最後入力データを、インデックス１００２の要素（１０．０）とする。
【０１４７】
ステップＳ３９０１において、入力データ・ベクトルＴＯストリーム変換部３２０１は、ファイルの読出しインデックスを、最後入力データのインデックス１００２＋１−重なり幅３＝１０００に設定する。
【０１４８】
また、ステップＳ３９０２において、入力データ・ベクトルＴＯストリーム変換部３２０１は、ファイルの読出しインデックス１０００の要素の時刻０：５７〜最後入力データのインデックス１００２の要素の時刻０：５９を、重なり時刻に設定する。
【０１４９】
また、ステップＳ３９０３において、入力データ・ベクトルＴＯストリーム変換部３２０１は、読出しインデックス１００２の要素（１０．０）をファイルから取得し、ステップＳ３９０４において、要素の時刻０：５９を付加したストリームデータを生成し、ストリーム格納キューＱに格納する。
【０１５０】
そして、ステップＳ３９０６において、入力データ・ベクトルＴＯストリーム変換部３２０１は、取得要素数（この段階ではインデックス１０００の要素１個）が入力データサイズ２４０個より小さいか否かを判断する。この場合は、小さいため、入力データ・ベクトルＴＯストリーム変換部３２０１は、読出しインデックスを１０００から１００１にする。このループを繰り返すことで、ベクトルデータＶＤの要素であるインデックス１００１〜１２３９のデータを順次取得し、ストリーム格納キューＱ５０１に、時刻０：５７〜４：５９のストリームデータ４０１１〜４０１５を格納することができる。
【０１５１】
＜出力データ・ストリームＴＯベクトル変換部３２０２による処理手順＞
図４１は、図３２に示した出力データ・ストリームＴＯベクトル変換部３２０２による処理手順例を示すフローチャートである。出力データ・ストリームＴＯベクトル変換部３２０２は、ストリーム格納キューＱから順次ストリームデータを取得する（Ｓ４１０１）。つぎに、出力データ・ストリームＴＯベクトル変換部３２０２は、取得したストリームデータに時刻が、重なりデータ時刻ＯＴと一致するか否かを判断する（ステップＳ４１０２）。
【０１５２】
一致する場合（ステップＳ４１０２：Ｙｅｓ）、ステップＳ４１０４に移行し、不一致である場合（ステップＳ４１０２：Ｎｏ）、出力データ・ストリームＴＯベクトル変換部３２０２は、取得したストリームデータをファイルに格納して（ステップＳ４１０３）、ステップＳ４１０４に移行する。
【０１５３】
ステップＳ４１０４では、出力データ・ストリームＴＯベクトル変換部３２０２は、バッチ処理基盤２６２１が終了したか否かを判断し（ステップＳ４１０４）、終了していない場合（ステップＳ４１０４：Ｎｏ）、ステップＳ４１０１に戻る。一方、終了した場合（ステップＳ４１０４：Ｙｅｓ）、出力データ・ストリームＴＯベクトル変換部３２０２による処理を終了する。
【０１５４】
＜ストリームデータからベクトルデータＶＤへの変換例＞
図４２は、ストリームデータからベクトルデータＶＤへの変換例を示す説明図である。図４２では、図４１のステップ番号を参照して説明する。ステップＳ４１０１において、出力データ・ストリームＴＯベクトル変換部３２０２は、ストリーム格納キューＱから順次ストリームデータ４２０１〜４２０４を取得する。
【０１５５】
ステップＳ４１０２において、出力データ・ストリームＴＯベクトル変換部３２０２は、取得したストリームデータごとに、重なりデータ時刻ＯＴと一致するか否かを判定する。この場合、時刻０：５８のストリームデータ４２０１が一致し、時刻１：０２以降のストリームデータ４２０２は不一致となる。このため、ステップＳ４１０３において、出力データ・ストリームＴＯベクトル変換部３２０２は、不一致である時刻１：０２以降のストリームデータ４２０２〜４２０４をファイルＦ２に格納する。これにより、前回のストリームデータと時刻が重複するストリームデータについては、ベクトル変換されないため、出力されない。これにより、後段のバッチプログラム６００は、ファイル参照して、バッチ処理を実行することができる。
【０１５６】
＜計算状態読出し部３２０３による処理手順＞
図４３は、図３２に示した計算状態読出し部３２０３による処理手順を示すフローチャートである。まず、計算状態読出し部３２０３は、オペレータツリー３４００を構成するオペレータを順次参照し（ステップＳ４３０１）、参照したオペレータの計算状態３２１１を、計算状態格納領域３２１０から取り出し、ストリームプログラム４００に書き込む（ステップＳ４３０２）。そして、計算状態読出し部３２０３は、オペレータツリー３４００の全オペレータを参照したか否かを判断する（ステップＳ４３０３）。全オペレータを参照していない場合（ステップＳ４３０３：Ｎｏ）、ステップＳ４３０１に戻る。一方、全オペレータを参照した場合（ステップＳ４３０３：Ｙｅｓ）、計算状態読出し部３２０３による処理を終了する。
【０１５７】
＜計算状態保持部３２０４による処理手順＞
図４４は、図３２に示した計算状態保持部３２０４による処理手順を示すフローチャートである。まず、計算状態保持部３２０４は、オペレータツリー３４００を構成するオペレータを順次参照し（ステップＳ４４０１）、参照したオペレータの計算状態３２１１を、ストリームプログラム４００から読出し、計算状態格納領域３２１０に保持する（ステップＳ４４０２）。そして、計算状態保持部３２０４は、オペレータツリー３４００の全オペレータを参照したか否かを判断する（ステップＳ４４０３）。全オペレータを参照していない場合（ステップＳ４４０３：Ｎｏ）、ステップＳ４４０１に戻る。一方、全オペレータを参照した場合（ステップＳ４４０３：Ｙｅｓ）、計算状態保持部３２０４による処理を終了する。
【０１５８】
このように、実施例２によれば、前回のバッチ処理時におけるストリーム処理の実行結果を用いることにより、実質的にストリームデータ間で重なりを持たせることができる。したがって、計算実行不可という状態を回避することができ、ストリームプログラムのセマンティックスを保持することができる。
【０１５９】
以上説明したように、本実施の形態によれば、ストリーム処理基盤上で、入力データに重なりを持たせる必要があるバッチプログラムを実行可能とすることができる。また、バッチプログラムの入力データサイズを増やし纏めて実行することで処理スループットの向上を図ることができる。また、バッチ処理基盤上で、入力データに重なりを持たせる必要があるストリームプログラムを実行可能にすることができる。
【０１６０】
すなわち、バッチ処理およびストリーム処理について、一方の処理基盤と当該一方の処理基盤上で他方の処理のプログラムを実行する場合、時系列データに重なりを持たせて他方の処理を実行することができる。これにより、一方の処理基盤上で実行する他方の処理のプログラムのコードやアルゴリズムを変更することなく、一方の処理基盤上で他方の処理のプログラムを実行することができる。したがって、既存のプログラムを処理が異なる処理基盤上で流用することができ、容易かつ効率的にプログラムを実行することができる。
【０１６１】
以上、本発明を添付の図面を参照して詳細に説明したが、本発明はこのような具体的構成に限定されるものではなく、添付した請求の範囲の趣旨内における様々な変更及び同等の構成を含むものである。
【図１】
0006038324.tif 000002
【図２】
0006038324.tif 000003
【図３】
0006038324.tif 000004
【図４】
0006038324.tif 000005
【図５】
0006038324.tif 000006
【図６】
0006038324.tif 000007
【図７】
0006038324.tif 000008
【図８】
0006038324.tif 000009
【図９】
0006038324.tif 000010
【図１０】
0006038324.tif 000011
【図１１】
0006038324.tif 000012
【図１２】
0006038324.tif 000013
【図１３】
0006038324.tif 000014
【図１４】
0006038324.tif 000015
【図１５】
0006038324.tif 000016
【図１６】
0006038324.tif 000017
【図１７】
0006038324.tif 000018
【図１８】
0006038324.tif 000019
【図１９】
0006038324.tif 000020
【図２０】
0006038324.tif 000021
【図２１】
0006038324.tif 000022
【図２２】
0006038324.tif 000023
【図２３】
0006038324.tif 000024
【図２４】
0006038324.tif 000025
【図２５】
0006038324.tif 000026
【図２６】
0006038324.tif 000027
【図２７】
0006038324.tif 000028
【図２８】
0006038324.tif 000029
【図２９】
0006038324.tif 000030
【図３０】
0006038324.tif 000031
【図３１】
0006038324.tif 000032
【図３２】
0006038324.tif 000033
【図３３】
0006038324.tif 000034
【図３４】
0006038324.tif 000035
【図３５】
0006038324.tif 000036
【図３６】
0006038324.tif 000037
【図３７】
0006038324.tif 000038
【図３８】
0006038324.tif 000039
【図３９】
0006038324.tif 000040
【図４０】
0006038324.tif 000041
【図４１】
0006038324.tif 000042
【図４２】
0006038324.tif 000043
【図４３】
0006038324.tif 000044
【図４４】
0006038324.tif 000045