(57)【要約】【課題】ストリームの頭出し再生において読み出し性能を改善する。【解決手段】情報処理システムは、時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部に格納された前記第１の分割データ、及び、前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部に格納された前記第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する。【選択図】図６
2014229061.tif 000002
【特許請求の範囲】
【請求項１】
時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部と、
前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部と、
前記時系列データについての再生時刻が指定された場合、前記第１の記憶部及び前記第２の記憶部に格納された前記第１の分割データ及び第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する出力部と、
を備えることを特徴とする情報処理システム。
【請求項２】
前記情報処理システムは、さらに、
前記時系列データを分割して生成した前記第１の分割データを前記第１の記憶部に格納し、前記時系列データを前記第１の分割データとは異なる時刻で分割して生成した第２の分割データを前記第２の記憶部に格納する格納処理部
を備えることを特徴とする請求項１に記載の情報処理システム。
【請求項３】
情報処理システムは、さらに、
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部
を備え、
前記格納処理部は、
前記時系列データを時系列順に連続する前記領域に格納し、前記複数の領域のうち前記第１の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第１の分割データを前記第１の記憶部に格納し、前記複数の領域のうち前記第２の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第２の分割データを第２の記憶部に格納する
ことを特徴とする請求項２に記載の情報処理システム。
【請求項４】
前記格納処理部は、前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第１の記憶部に未格納のデータを前記第１の記憶部に格納し、前記第２の記憶部に未格納のデータを前記第２の記憶部に格納する
ことを特徴とする請求項３に記載の情報処理システム。
【請求項５】
前記格納処理部は、前記時系列データの重要度に応じて、前記時系列データを前記第１及び第２の分割データとは異なる時刻で分割して生成した第３の分割データを第３の記憶部に格納し、
前記出力部は、前記時系列データについての再生時刻が指定された場合、前記第１の記憶部、前記第２の記憶部、及び前記第３の記憶部に格納された前記第１の分割データ、前記第２の分割データ、及び前記第３の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする請求項２〜４のうちいずれか１項に記載の情報処理システム。
【請求項６】
時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部に格納された前記第１の分割データ、及び、前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部に格納された前記第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする情報処理システムの制御方法。
【請求項７】
プロセッサに、
時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部に格納された前記第１の分割データ、及び、前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部に格納された前記第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
処理を実行させることを特徴とする制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ストレージシステムに関する。
【背景技術】
【０００２】
センサ情報や各種ログなどを対象に実時間分析処理（ＲＴＡＰ（Real-time Analysis Process））の市場が拡大しており、その入力となる時系列データの効率的な蓄積及び利用が重要になっている。そして、例えば、時系列データの情報収集解析サービスがクラウド上で実行される場合、多数のセンサからの入力情報やログの情報が束ねられて膨大なデータが蓄積され、必要に応じて蓄積されたデータの全データまたは一部が再生される。
【０００３】
時系列データが通常のデータと異なる点は、順序が規定されたデータ列であって、個別のデータのみならず全体として処理対象となるもの（以下、ストリームと記す）である点である。例えば、既に蓄積済のストリームを指定し、ある時刻からある時刻までのデータを順番に読み出すといった処理が行われる。以下の説明では、ストリームの個々のデータをストリームデータと記す。
【０００４】
大流量のストリームデータをストレージに蓄積するには、ネットワーク特性やストレージ特性に適したデータサイズで書き込むことにより書き込みスループットを極大化する。ネットワーク特性とは、例えばTCP/IP（Transmission Control Protocol/Internet Protocol）通信網の特性である。ストレージ特性とは、例えば、ハードディスクの入出力特性である。具体的には例えば、１つ１つのサイズが小さいストリームデータを記憶装置に格納する場合、複数のストリームデータを部分データ列の形にまとめて記憶装置に格納することによりスループットを向上させる。この複数のストリームデータを含む部分データ列を以下の説明ではブロックと記す。
【０００５】
一方、以下のビデオコンテンツを再生する再生装置が知られている。すなわち、この再生装置では、ビデオストリームを保存〔記憶〕するよう、ビデオコンテンツ手段が設けられる。また、各ビデオストリームには複数のシーンが含まれ、各シーンは対応するシーン特性によって記述される。また、再生装置にはユーザーが視聴したいシーンのビデオコンテンツを記述するシーン特性を選択するための選択手段が設けられている。また、再生装置には、選択されたシーン特性を保存されているビデオストリームのシーン特性と比較して、シーン特性が選択されたシーン特性と類似する一つ以上のシーンを同定するための手段が設けられている。さらに、再生装置には選択されたシーン特性と類似と同定されたシーン特性をもつ少なくとも一つのシーンを再生する手段が設けられている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１１−４１２９９号公報
【特許文献２】国際公開第２００６／０１１２７０号
【発明の概要】
【発明が解決しようとする課題】
【０００７】
ストリームデータの再生処理では、特定の時刻を指定してその時点からデータを再生する頭出し再生が行われる。具体的には、頭出し機能とは、指定された時刻を開始時刻として、データ列を時刻の古いものから順次取得して再生するものである。分散ストレージシステムにおいて頭出し再生が行われる場合、記憶装置からのデータの読み出しは、指定された再生開始時刻のデータが含まれるブロック単位で行われる。そして、読み出されたブロックのうち、ブロックの最初のデータから指定された再生開始時刻前のデータは読み飛ばされて、再生開始時刻のデータから再生処理が開始される。このように、頭出し再生において、再生開始時刻のデータがブロックの途中に含まれる場合、無駄なデータの読み出しが発生する。
【０００８】
上記ビデオコンテンツを再生する再生装置では、頭出し再生において、再生開始時刻のデータがブロックの途中に含まれる場合に発生する無駄なデータの読み出しについては考慮されていない。
【０００９】
そこで、１つの側面では、本発明は、ストリームの頭出し再生において読み出し性能を改善することを目的とする。
【課題を解決するための手段】
【００１０】
一態様の情報処理システムは、第１の記憶部、第２の記憶部、及び出力部を含む。第１の記憶部は、時系列データが分割されたデータを示す第１の分割データを格納する。第２の記憶部は、時系列データが分割されたデータを示す第２の分割データであって、第１の分割データとは異なる時刻で分割された第２の分割データを格納する。出力部は、時系列データについての再生時刻が指定された場合、第１の記憶部及び第２の記憶部に格納された第１の分割データ及び第２の分割データのうち、再生時刻前であって再生時刻に直近する時刻で分割された分割データを読み出して、出力する。
【発明の効果】
【００１１】
本実施形態に係る情報処理システムによれば、ストリームの頭出し再生において読み出し性能を改善することができる。
【図面の簡単な説明】
【００１２】
【図１】本実施形態に係るストリームの格納と再生について説明するための図である。
【図２】ストリームデータの多重化について説明するための図である。
【図３】データを３重化した場合のブロックの区切り位置に関する系列間の関係を示す。
【図４】重要度に応じて冗長度を変更することを説明するための図である。
【図５】過剰な冗長化を減らすことができることを説明するための図である。
【図６】情報処理システムの機能ブロック図を示す。
【図７】記憶装置へのストリームデータの書き出し処理に関する情報処理システムの構成を示す。
【図８】記憶装置からのストリームデータの読み込み処理に関する情報処理システムの構成を示す。
【図９】管理情報の構成の一例を示す。
【図１０】データの冗長化において、データが三重化されて保存される場合の例を説明するための図である。
【図１１】ストリーム終端を説明するための図である。
【図１２】実施形態１に係るブロックの生成と記憶装置への書き出し処理の動作フローを示す。
【図１３】実施形態１に係る書き出し処理１を説明するための図である。
【図１４】実施形態１に係る書き出し処理１の動作フローを示す。
【図１５】実施形態１に係る書き出し処理２を説明するための図である。
【図１６】実施形態１に係る書き出し処理２の動作フローを示す。
【図１７】実施形態１に係る制御部がストリームデータの終端データを検出した場合の動作フロー図を示す。
【図１８】実施形態１に係る書き出し処理３を説明するための図である。
【図１９】実施形態１に係る書き出し処理３の動作フローを示す。
【図２０】冗長度の増加処理の動作フローを示す。
【図２１】冗長度の減少処理の動作フローを示す。
【図２２】再冗長化処理の動作フローを示す。
【図２３】再冗長化対象の区間に存在するデータを含む複数のブロックの例を示す。
【図２４】データの再生時の動作フローを示す。
【図２５】実施形態２に係る書き出し処理の制御変数の一例を示す。
【図２６】実施形態２に係るブロックの生成と記憶装置への書き出し処理の動作フローを示す。
【図２７】実施形態２に係る書き出し処理４の動作フローを示す。
【図２８】実施形態２に係る書き出し処理５の動作フローを示す。
【図２９】実施形態２に係る制御部がストリームデータの終端データを検出した場合の動作フロー図を示す。
【図３０】実施形態２に係る書き出し処理６の動作フローを示す。
【図３１】実施形態２に係るオフセット位置変更時の動作フローを示す。
【図３２】実施形態２に係る変更処理１の動作フローを示す。
【図３３】実施形態２に係る変更処理２の動作フローを示す。
【図３４】情報処理装置のハードウェア構成の一例を示す。
【発明を実施するための形態】
【００１３】
（実施形態１）
時系列データは、例えば、個人の生涯健康管理データ（Personal Health Record）である。個人の健康状態を個別に管理するために、医療機関・薬局・健康関連事業者・健康情報測定機器などが作り出す各種データを随時記録していく。一般的に、保存する情報は身長や体重、血液型、バイタル情報（脈拍、呼吸、血圧、体温など）、アレルギー、副作用、既往歴・症状、通院・検査・診療、処方・投薬、主治医のコメント、ケアプラン、食事情報、運動情報、検診、保険関連情報が含まれる。
【００１４】
このうちバイタル情報から潜在的あるいは将来的な疾患・疾病をリアルタイムに予測分析する場合には保存した長期間のデータから、分析の観点に応じて必要な範囲の時系列データに素早くアクセスする必要がある。
【００１５】
また、分析を並列処理で行うとき、同一データへのアクセスが競合しないように、データの複製（レプリカ）を別の場所に配置することもある。
【００１６】
治療履歴（投薬の履歴等）は医療ミスの検証で重要な証拠になりうるため、データの信頼性が重要である。全ての治療記録に高信頼性が必要ではなく、保存コストを考慮した場合には時々刻々ケースバイケースでデータの信頼性が変化するとみなす方がよい。
【００１７】
図１は、本実施形態に係るストリームの格納と再生について説明するための図である。ストリームは、頭出し性能、負荷分散、信頼性を考慮して複数のブロックに分割される。ここで、分割されたブロックは、互いに重複部分を含んでもよい。そして、分割されたブロックは分散ストレージに分散されて格納される。格納されたストリームの再生時には、再生区間で指定されたデータを含むブロックが分散ストレージから取得され、取得された複数のブロックにおいて重複部分を削除して再生区間のストリームが再構築される。
【００１８】
近年のストレージシステム(例えば、分散KVS（Key-Value Store）に代表されるNoSQL)は、複数のノードにデータの複製（レプリカ）が配置される。これにより、ディスク故障などによるデータ消失の確率を下げるとともに、複数のノードに配置したレプリカからデータの読み込みが可能になるため、アクセスの負荷分散が行えるようになる。このように、ブロックのレプリカを分散して配置することで高信頼性とアクセスの高速性が実現される。
【００１９】
図２は、ストリームデータの多重化について説明するための図である。図２に示されるように、データが多重化されるとは、同一時刻（区間）のデータが複製され、元のデータ及び複製されたデータがそれぞれ異なる記憶装置（例えばディスク）に格納されることを指す。そして、同一時刻（区間）のデータが分散して格納される異なる記憶装置の数を示す値が冗長度である。
【００２０】
図２においては、情報処理装置３０は、ストリームを受信すると、受信したストリームを３つのブロックに複製して、それぞれのブロックを異なるディスク３１ａ、３１ｂ、３１ｃに格納している。図２の例では、冗長度は３である。
【００２１】
以下の説明では、１つのストリームを冗長化（複製）して記憶装置毎に格納されたデータを区別するために、個々の記憶装置に格納されるデータ群を１つの系列と表現する。すなわち、ある系列のデータは、その系列に対応する記憶装置に格納されたデータを指す。
【００２２】
複数の異なる記憶装置に格納されるデータは、ブロック単位で格納される。ブロックは、同一のストリームの時系列における特定の範囲に含まれる複数のストリームデータをまとめたものであり、再生時に読みだされるデータの最小単位である。
【００２３】
本実施形態では、複数の異なる記憶装置に格納されるブロックの区切り位置は、系列毎に異なる。図３は、本実施形態において、データを３重化した場合のブロックの区切り位置に関する系列間の関係を示す。
【００２４】
図３においては、横軸はデータの到着順（時刻）を示している。尚、ここでは、到着時刻とは、ストリームを複製する装置（図２における情報処理装置３０）に到着した時刻を指すが、ストリームの個々のデータの測定または観測時刻であってもよい。また、系列１、系列２、及び系列３の３つの系列のブロックは、お互いに異なる時刻で区切られている。
【００２５】
系列２の区切り位置は、系列１と比較すると、系列１のブロックの区切り位置から時間軸において1/3後方にずれている。また、系列３の区切り位置は、系列１と比較すると、系列１のブロックの区切り位置から時間軸において2/3後方にずれている。
【００２６】
データの読み出し時には、系列１、系列２、系列３のいずれかのデータを用いることができる。そのため、図２の例のように３重化された例においては、読み込み可能な開始位置の間隔が元の1/3となるので、頭出し再生の処理に係る実行時間は、系列１のみの場合と比べて1/3で行えることになる。
【００２７】
また、系列１、系列２、及び系列３のデータはそれぞれ異なる記憶装置に格納されるため、１つの記憶装置に対してアクセスが集中することにより発生する処理待ちを防ぐことができる。すなわち、系列１のデータを読み出すことと並行して、系列２のデータの読み出しが行えるため、読み出し速度が向上する。さらに、データの信頼性の向上とアクセスの負荷分散が行われる。
【００２８】
ストリームデータにおいては、時間区間ごとにデータ重要度やアクセス頻度が異なる場合がある。そして、重要なデータやアクセス頻度が高いデータについては、通常以上に冗長度を上げて信頼性やアクセス性能を高めたい場合がある。
【００２９】
図４は、重要度に応じて冗長度を変更することを説明するための図である。図４の上図の棒グラフでは、横軸は時刻を示し、縦軸は重要度またはアクセス頻度を示す。図４の下図は、図４の上図の棒グラフで示す重要度またはアクセス頻度に応じたストリームデータの冗長度を示す。図４では、最も重要度（またはアクセス頻度）が高い時刻に対応するストリームデータの冗長度が４になっている。このように、重要度（またはアクセス頻度）が高いデータに対しては、冗長度を高くする。
【００３０】
このようにデータの重要度やアクセス頻度に応じて冗長度を変更するために、本実施形態では、ブロックの重複区間を追加または削除することにより冗長度を変更する。このとき、ブロックの大きさを固定しなければ、過剰な冗長化を減らすことができる。
【００３１】
図５は、本実施形態において、過剰な冗長化を減らすことができることを説明するための図である。尚、以下の説明ではデータの重要度に適した冗長度を期待冗長度と記す。
【００３２】
図５（Ａ）は、ブロックの大きさを固定することで過剰な冗長化が生じている例である。冗長化させる区間が１ブロックで十分な区間であっても（期待冗長度が１の部分）、冗長度が２となっているので、過剰な冗長化が生じている。
【００３３】
図５（Ｂ）は、ブロック長を変更することにより、過剰な冗長化を減らした例である。図５（Ｂ）では、期待冗長度１のデータを含む系列１のブロックのサイズが縮小されることにより、過剰な冗長化を防いでいる。
【００３４】
尚、ストリームデータの重要度は、種々の方法を用いて決定される。例えば、時系列データの特性に応じて、日中に取得したデータは重要度を高くし、夜間に取得したデータは重要度を低くする等の方法が考えられる。また、ストリームデータの重要度には、ストリームデータのアクセス頻度を用いてもよい。
【００３５】
また、例えば、図２に示した三重化に加えて、重要度の高いデータの箇所のみさらに、高い冗長度にすることもできる。この場合、全データについて少なくとも冗長度を３に保つことを保証しつつ、さらに高い多重度を実現できる。
【００３６】
図６は、本実施形態における情報処理システムの機能ブロック図を示す。情報処理システム１は、第１の記憶部２、第２の記憶部３、出力部４、格納処理部５、循環格納部６、及び第３の記憶部７を含む。
【００３７】
第１の記憶部２は、時系列データが分割されたデータを示す第１の分割データを格納する。
【００３８】
第２の記憶部３は、時系列データが分割されたデータを示す第２の分割データであって、第１の分割データとは異なる時刻で分割された第２の分割データを格納する。
【００３９】
出力部４は、時系列データについての再生時刻が指定された場合、第１の記憶部２及び第２の記憶部３に格納された第１の分割データ及び第２の分割データのうち、再生時刻前であって再生時刻に直近する時刻で分割された分割データを読み出して、出力する。また、出力部４は、時系列データについての再生時刻が指定された場合、第１の記憶部２、第２の記憶部３、及び第３の記憶部７に格納された第１の分割データ、第２の分割データ、及び第３の分割データのうち、再生時刻前であって再生時刻に直近する時刻で分割された分割データを読み出して、出力する。
【００４０】
格納処理部５は、時系列データを分割して生成した第１の分割データを第１の記憶部２に格納し、時系列データを第１の分割データとは異なる時刻で分割して生成した第２の分割データを第２の記憶部３に格納する。また、格納処理部５は、時系列データを時系列順に、連続する循環格納部６の領域に格納し、複数の循環格納部６の領域のうち第１の記憶部２に対応付けられた領域に時系列データを格納した場合、循環格納部６の複数の領域に格納されているデータを複製して生成した第１の分割データを第１の記憶部２に格納し、循環格納部６の複数の領域のうち第２の記憶部３に対応付けられた領域に時系列データを格納した場合、循環格納部６の複数の領域に格納されているデータを複製して生成した第２の分割データを第２の記憶部３に格納する。また、格納処理部５は、循環格納部６の領域に時系列データの終端を示すデータを格納した場合、循環格納部６の複数の領域に格納されているデータのうち、第１の記憶部２に未格納のデータを第１の記憶部２に格納し、第２の記憶部３に未格納のデータを第２の記憶部３に格納する。また、格納処理部５は、時系列データの重要度に応じて、時系列データを第１及び第２の分割データとは異なる時刻で分割して生成した第３の分割データを第３の記憶部７に格納する。
【００４１】
循環格納部６は、情報を格納する複数の領域であって、論理的に循環する形式で配置された複数の領域を含む。
【００４２】
第３の記憶部７は、時系列データを第１及び第２の分割データとは異なる時刻で分割して生成した第３の分割データを格納する。
【００４３】
図７及び図８は、本実施形態における情報処理システムの構成を示す。図７は、記憶装置へのストリームデータの書き出し処理に関する情報処理システムの構成を示す。
【００４４】
情報処理装置４０は、ストリームデータを受信し、受信したストリームデータを複製して、複数の記憶装置４７ａ、４７ｂを含む分散ストレージ４８に書き出す処理を行う。書き出しの単位は、複数のストリームデータを含むブロック単位である。この書き出し処理を実現するために、情報処理装置４０は、ストリームデータ受信部４１、バッファ領域４２、制御部４３、制御変数領域４４、ブロック区間データベース（以下、データベースを「ＤＢ」という）４５、及びブロック送信部４６を含む。
【００４５】
記憶装置４７ａ、４７ｂは、第１の記憶部２、第２の記憶部３、第３の記憶部７の一例である。ストリームデータ受信部４１、制御部４３、ブロック送信部４６は、格納処理部４の一例である。バッファ領域４２は、循環格納部５の一例である。
【００４６】
ストリームデータ受信部４１は、ストリームデータを受信し、受信したストリームデータをバッファ領域４２に格納する。
【００４７】
バッファ領域４２は、複数のストリームデータをブロックとしてまとめるために使用される作業領域である。
【００４８】
制御部４３は、バッファ領域４２に格納された個々のストリームデータをまとめることによりブロックを生成し、ブロック送信部４６を介して記憶装置４７ａ、４７ｂに対して送信する。ここで、バッファ領域４２に格納されたストリームデータは複製されて、複数の異なる記憶装置４７ａ、４７ｂに送信される。すなわち、ストリームデータは冗長化される。以下の説明では、制御部４３がストリームデータを記憶装置４７ａ、４７ｂに対して送信することを書き出し処理と記す場合がある。
【００４９】
制御変数領域４４は、制御部４３の書き出し処理により使用される制御変数情報が格納される領域である。
【００５０】
ブロック区間ＤＢ４５は、制御部４３が生成したブロックに関する管理情報が格納される。管理情報には、ブロックに含まれる複数のストリームデータのうち、時系列において最初のストリームデータの（取得）時刻と最後のストリームデータの（取得）時刻の情報が含まれる。ここで、以下の説明では、ブロックに含まれる最初のストリームデータの時刻をブロックの開始時刻と記し、最後のストリームデータの時刻をブロックの終了時刻と記す場合がある。また、管理情報には、ブロックがどの記憶装置４７ａ、４７ｂに格納されるかを示す情報、すなわち、どの系列の情報かを示す情報が格納される。
【００５１】
ブロック送信部４６は、制御部４３により生成されたブロックを記憶装置４７ａ、４７ｂに対して送信する。
【００５２】
記憶装置４７ａ、４７ｂは、情報処理装置４０に接続され、受信したブロックを記憶する。以下の説明では、記憶装置４７ａ、４７ｂを特に区別しない場合には、単に記憶装置４７と記す。記憶装置４７は情報処理装置４０にＮＡＳ（Network Attached Storage）やＳＡＮ（Storage Area Network）等のネットワークを介して接続されてもよいし、ＰＣＩ（Peripheral Component Interconnect）Ｅｘｐｒｅｓｓ等のバスを介して接続されてもよい。また、記憶装置４７は、情報処理装置４０に含まれてもよい。尚、図７の例では、冗長度が２の場合として記憶装置が２つに冗長化された例を記したが、分散ストレージ４８に含まれる記憶装置４７は、データの多重度に応じて、さらに冗長化されてもよい。
【００５３】
次に、記憶装置からのストリームデータの読み込み処理について説明する。図８は、ストリームデータの記憶装置からの読み込み処理に関する情報処理システムの構成を示す。
【００５４】
情報処理装置５０は、ストリームデータの再生要求を受信し、受信した再生要求の読み込み対象範囲のストリームデータを含むブロックを分散ストレージ８０に含まれる記憶装置５９ａ、５９ｂから取得する。そして、情報処理装置５０は、取得したブロックから読み込み対象範囲のストリームデータを生成して、生成したストリームデータを再生要求元に送信する。この読み込み処理を実現するために、情報処理装置５０は、リクエスト受信部５１、制御部５２、制御変数領域５３、ブロック区間ＤＢ５４、リクエスト送信部５５、ブロック受信部５６、バッファ領域５７、再生データ送信部５８を含む。
【００５５】
記憶装置５９ａ、５９ｂは、第１の記憶部２、第２の記憶部３、第３の記憶部７の一例である。制御部５２は、出力部４の一例である。
【００５６】
リクエスト受信部５１は、ストリームデータの再生要求を情報処理装置５０に接続された端末から受信し、受信した再生要求を制御部５２に転送する。再生要求には、再生要求範囲として開始時刻と終了時刻が指定されており、この開始時刻と終了時刻の間のストリームデータが読み出し対象のストリームデータとなる。
【００５７】
制御部５２は、再生要求を受信すると、再生要求範囲のストリームデータが含まれるブロックをブロック区間ＤＢ５４から検索する。そして、制御部５２は、リクエスト送信部５５を介して、検索したブロックの取得要求を記憶装置５９ａ、５９ｂに送信する。ブロックの取得要求を受けた記憶装置５９ａ、５９ｂから、要求したブロックがバッファ領域５７に格納されたら、制御部５２は、各ブロックの重複部分を除去し、または複数のブロックを連結し、再生範囲のストリームである再生ストリームを生成する。そして、制御部５２は、再生データ送信部５８を介して、生成した再生ストリームを再生要求の送信元の端末に送信する。
【００５８】
制御変数領域５３は、制御部５２の読み込み処理により使用される制御変数情報が格納される領域である。
【００５９】
ブロック区間ＤＢ５４は、図７のブロック区間ＤＢ４５と同じである。
リクエスト送信部５５は、制御部５２からのブロックの取得要求を分散ストレージ８０に送信する。
【００６０】
ブロック受信部５６は、ブロック取得リクエストを受けた分散ストレージ８０から送信されたブロックを受信する。そして、ブロック受信部５６は、受信したブロックをバッファ領域５７に格納する。
【００６１】
バッファ領域５７は、ブロックの取得要求を受けた記憶装置５９ａ、５９ｂからブロック受信部５６を介してブロックが格納される領域であって、制御部５２により、再生ストリームの生成に使用される領域である。
【００６２】
再生データ送信部５８は、制御部５２により生成された再生ストリームを再生要求元に送信する。
【００６３】
尚、分散ストレージ８０は、図７において説明した分散ストレージ４８に対応しており、記憶装置５９ａ、５９ｂは、図７において、ブロックが格納された記憶装置４７ａ、４７ｂに対応する。すなわち、記憶装置５９ａ、５９ｂには、記憶装置４７ａ、４７ｂに格納されたのと同様にブロックが格納されているものである。以下の説明では、記憶装置５９ａ、５９ｂを特に区別しない場合には、単に記憶装置５９と記す。
【００６４】
次に、ブロック区間ＤＢ４５、５４に格納されるブロックの管理情報について説明する。図９は管理情報の構成の一例を示す。
【００６５】
管理情報６０は、ブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４のデータ項目を含む。
【００６６】
ブロック番号６１は、記憶装置４７に格納されるブロックを一意に識別するためのブロック番号である。開始時刻６２は、ブロック番号６１のブロックの開始時刻を示す情報である。終了時刻６３は、ブロック番号６１のブロックの終了時刻を示す情報である。系列番号６４は、ブロック番号６１で示されるブロックの系列を示す情報である。系列番号６４は、言い換えるとブロックが格納される記憶装置を識別するための情報ともいえる。
【００６７】
次に、データの冗長化処理について詳細に説明する。ストリームデータを冗長化して記憶装置４７に格納するための仕組みの１つとして、本実施形態では循環バッファが用いられる。尚、循環バッファ（リングバッファ）は、バッファ領域４２、５７の一例である。
【００６８】
ストリームデータ受信部４１は、ストリームデータを受信すると、受信したデータを循環バッファに格納する。そして、図３を参照して説明したように、制御部４３は循環バッファに格納されたデータを系列間でブロックの区切り位置をずらして、冗長化された個々の記憶装置４７に書き出す。
【００６９】
循環バッファは、個々のストリームデータを格納することができる領域（要素）を複数含み、その領域（要素）は循環バッファ内で一意に振られたインデックス（添え字）により区別される。本実施形態においては、インデックスは、各領域（要素）に一意に対応付けられた0から昇順に振られた整数とする。循環バッファにおいてインデックスが対応付けられた各領域の数（要素数）を、以下の説明ではバッファサイズと記す。
【００７０】
循環バッファでは、データが格納される領域はインデックスを指定することにより特定されるが、インデックスを指定するために与えられる値は、バッファサイズより大きい値でもよい。インデックスを指定するために与えられる値がバッファサイズより大きい場合は、指定されたインデックスをバッファサイズで割ったときの余りの値のインデックスが指定される。よって、循環バッファは直線状のバッファの両端を論理的に繋げたバッファといえる。
【００７１】
本実施形態において１つのブロックにN個のストリームデータが含まれるとすると、循環バッファは、N（N：整数）個のストリームデータを格納可能である。以下では、バッファサイズをNとする。循環バッファに格納される個々のデータは、受信した順にバッファのインデックスの昇順に格納される。そして、循環バッファの最後のインデックス（本実施形態ではN-1）の領域にデータが格納されると、次に受信されたデータは最初のインデックス（本実施形態では0）の領域に格納される。循環バッファの個々の領域（要素）のサイズは固定としてもよいし、格納されるデータのサイズに応じて可変としてもよい。すなわち、循環バッファに格納される個々のデータのサイズはそれぞれ異なってもよい。
【００７２】
制御部４３は、ストリームデータが循環バッファの領域のうちの所定のインデックスの領域に格納された場合、及び、循環バッファに格納されたデータがストリームの終端データである場合に、循環バッファ内のデータを記憶装置４７に書き出す処理を行う。
【００７３】
先ず、ストリームデータが循環バッファの領域のうちの所定のインデックスの領域に格納された場合に、循環バッファ内のデータを記憶装置４７に書き出す処理について説明する。
【００７４】
ストリームデータの書き出し処理のトリガとなるインデックスは、冗長化された個々の記憶装置４７、すなわち系列にそれぞれ対応付けられており、循環バッファに等間隔で配置される。
【００７５】
図１０は、本実施形態におけるデータの冗長化において、データが三重化されて保存される場合の例を説明するための図である。
【００７６】
データが三重化されて格納される場合において、個々の記憶装置４７に格納されるデータ群を１つの系列とすると、循環バッファのインデックスが(N/3-1)、(2N/3-1)、N-1の位置にデータが格納された場合に、それぞれの系列のデータの書き出し処理が行われる。この各系列に対応した、書き出し処理が行われる際のインデックスの位置を、以下の説明では、オフセット位置と記す場合がある。オフセット位置は、循環バッファにおいて等間隔で配置することにより、系列間のブロックの区切り位置が等間隔でずれることになる。
【００７７】
１つのブロックに格納されるデータの数がN、冗長度がK（K：整数）である場合において、循環バッファのインデックスが0からN-1までとすると、オフセット位置は、(N*x/K-1)（x=1,2,…,K）となる。図１０の例の場合、冗長度K=3であるので、オフセット位置は、(N/3-1)、(2N/3-1)、N-1となる。
【００７８】
データが三重化される場合には３つの系列が存在することとなるが、ここでは説明のために、それぞれの系列を系列１、系列２、系列３とする。すると、制御部４３は、循環バッファのインデックスが(N/3-1)である領域にデータが格納された場合、循環バッファに格納されているデータを１つのブロックとして、系列１に対応する記憶装置４７に格納する。また、制御部４３は、循環バッファのインデックスが(2N/3-1)である領域にデータが格納された場合、循環バッファに格納されているデータを１つのブロックとして、系列２に対応する記憶装置４７に格納する。そして、制御部４３は、循環バッファのインデックスがN-1である領域にデータが格納された場合、循環バッファに格納されているデータを１つのブロックとして、系列３に対応する記憶装置４７に格納する。尚、制御部４３がバッファ内のデータを各系列に対応する記憶装置４７に格納するタイミングではバッファの内容は失われず、そのまま保持される。
【００７９】
また、制御部４３は、循環バッファに格納されたデータがストリームの終端データである場合に、循環バッファ内のデータを記憶装置４７に書き出す。
【００８０】
ストリームデータには、ストリームの終端を表す終端データがある。図１１は、ストリーム終端を説明するための図である。ストリームは論理的に区切られたデータの列であるが、ストリームの末尾には、ストリーム終端という特別な区切りがある。このようなストリームの特別な区切りを示すデータが終端データである。終端データは、例えば、区切りを表す特殊な属性を持ってもよいし、特定のサイズとすることにより、区切りを表すことを示してもよい。
【００８１】
次に、制御部４３による循環バッファからの記憶装置４７に対するデータの書き出し処理の動作について説明する。
【００８２】
制御部４３による書き出し処理は、書き出しのタイミングと、書き出し処理時のバッファの状態により、３つのパターンがある。この３つのパターンを書き出し処理１、書き出し処理２、書き出し処理３として説明する。
【００８３】
制御部４３によるブロックの書き出しタイミングは、受信したストリームデータが循環バッファのオフセット位置に格納された時点、及び、制御部４３によりストリームデータの終端が検知された時点である。
【００８４】
書き出し処理時の循環バッファの状態としては、循環バッファのすべての領域（要素）にデータが格納されている状態と、循環バッファの一部の領域（要素）にデータが格納されている状態がある。循環バッファの一部の領域（要素）にデータが格納されている状態は、循環バッファに何もデータが格納されていない状態から、一度目に循環バッファの最後のインデックスの領域にデータが格納されるまでの状態を示す。すなわち、データが格納される循環バッファのインデックスが１周完了前である場合である。一度最後のインデックスの領域にデータが格納されると、それ以降は、すべての領域（要素）にデータが格納されている状態となる。
【００８５】
書き出し処理１は、書き出しのタイミングに関わらず、書き出し処理時の循環バッファの状態が一部の領域（要素）にデータが格納されている状態である場合に実行される。書き出し処理１では、制御部４３は、最初のインデックス（本実施形態では0）から、最後にデータを格納したインデックスまでのデータを１つのブロックとして生成し、生成したブロックを記憶装置４７に格納する。すなわち、データがオフセット位置に格納された場合に書き出しが行われる場合は、制御部４３は、先ず、最初のインデックスからオフセット位置までの領域に格納されているデータを１つのブロックとして生成する。そして制御部４３は、生成したブロックをオフセット位置に対応付けられた記憶装置４７に格納する。終端データを検知した場合には、制御部４３は、最初のインデックスから終端データを格納したインデックスまでの領域に格納されているデータを記憶装置４７に格納する。尚、制御部４３により生成されるブロックには、ストリームデータは循環バッファに格納された順に先頭から配置される。
【００８６】
書き出し処理２は、受信したストリームデータが循環バッファのオフセット位置に格納された時点で、循環バッファのすべての領域（要素）にデータが格納されている状態である場合に実行される。書き出し処理２では、制御部４３は、書き出し対象系列のオフセット位置の次のインデックスからインデックスの昇順に循環バッファ内のデータを１つのブロック（説明のためにブロックＡとする）に追加していく。そして、循環バッファの最後のインデックスに到達したら、最初のインデックスに戻り、最初のインデックスからオフセット位置までのデータをインデックスの昇順に、ブロックＡに追加する。そして、制御部４３は、生成したブロック（ブロックＡ）を記憶装置４７に書き出す。
【００８７】
書き出し処理３は、制御部４３が終端データを検知した時点で、そのデータが格納されたインデックスが書き出し対象系列のオフセット位置より小さい場合に実行される。もしくは、書き出し処理３は、制御部４３が終端データを検知した時点で、そのデータが格納されたインデックスが書き出し対象系列のオフセット位置より大きい、且つ、既に一度循環バッファの全ての要素にデータが格納されている場合に実行される。
【００８８】
書き出し処理３では、制御部４３は、書き出し対象系列のオフセット位置の次のインデックスからインデックスの昇順に循環バッファ内のデータを１つのブロック（説明のためにブロックＢとする）に追加していく。そして、循環バッファの最後のインデックスに到達したら、最初のインデックスに戻り、最初のインデックスから格納位置までのデータをインデックスの昇順に、最後のインデックスまでに到達するまでにデータを追加していたブロック（ブロックＢ）に追加する。そして、制御部４３は、生成したブロック（ブロックＢ）を記憶装置４７に書き出す。
【００８９】
図１２は、ブロックの生成と記憶装置４７への書き出し処理の動作フローを示す。
図１２においては、循環バッファのバッファサイズをN、循環バッファをbuffer[]、冗長度をK、系列毎のオフセット位置に１加えた値が格納された配列（以下、オフセット配列と記す場合がある）をpos[]とする。さらに、ストリームデータ受信部４１による循環バッファへのデータの格納位置のインデックスを示す変数をwp、循環バッファのすべてのインデックスに少なくとも一度情報が格納されたか否かを示す変数をfirst_cycとする。
【００９０】
buffer[]は、循環バッファを要素数Nの配列で表したものであり、buffer[]の添字は、上述した循環バッファのインデックスに対応する。配列buffer[]の各要素には受信したストリームデータが格納される。尚、以下の説明では、単に「インデックス」と記す場合には、循環バッファのインデックス、すなわち、buffer[]の添字のことを指し、その他の配列の添字を記す場合には、明示的に配列名を指定して「添字」と記す。尚、配列buffer[]の各要素は格納されるデータに応じて可変長であってよい。
【００９１】
wpは、ストリームデータ受信部４１がデータを循環バッファに格納する際の格納位置のインデックスを示す変数である。すなわち、ストリームデータ受信部４１は循環バッファのwpの値のインデックスに受信したストリームデータを格納する。以下の説明においては、ストリームデータ受信部４１がデータを循環バッファに格納する際の格納位置を単に格納位置wpと記す場合がある。
【００９２】
配列pos[]は、系列毎のオフセット位置に１を加えた値が格納された配列である。pos[0]には系列１のオフセット位置に１を加えた値が格納され、pos[1]、pos[2]、・・・、pos[K-1]には、それぞれ、系列２、系列３、・・・、系列Ｋのオフセット位置に１を加えた値が格納される。例えば、x=1,2,…,K-1とすると、pos[x-1]=(N*x/K)、pos[K-1]=0となる。
【００９３】
first_cycは、循環バッファのすべてのインデックスに少なくとも一度ストリームデータが格納されたか否かを示す変数であり、すなわち、制御部４３が循環バッファにストリームデータを格納する処理が１周目か否かを示す変数である。first_cycの値がtrueである場合は、制御部４３が循環バッファにストリームデータを格納する処理が１周目であることを示す。以下の説明においては、first_cycは、１周目フラグfirst_cycと記す場合がある。
【００９４】
変数の初期化処理として、制御部４３は、wpに0を代入し、first_cycにtrueを代入する。また、制御部４３は、pos[]のそれぞれの要素には、各系列のオフセット位置に１を加えた値を格納する。
【００９５】
変数の初期化処理の後、制御部４３は、ストリームデータを受信する毎に、Ｓ３０１〜Ｓ３１０の処理を実行する。Ｓ３０１〜Ｓ３１０の１回のループは、ストリームデータ受信部４１が１つのストリームデータを受信する毎に実行される処理であり、循環バッファの１つの領域（要素）にストリームデータが格納される処理である。また、１回のループが完了する毎に、循環バッファのストリームデータが格納されるインデックスは１つずつ進む。そして、循環バッファの最終インデックスにデータが格納されるループが終了すると、次のループでは、最初のインデックスにデータが格納されるループに戻る。
【００９６】
制御部４３は、ストリームデータを受信すると、buffer[wp]に受信したデータを格納する（Ｓ３０１）。ここで、上述したように、wpはストリームデータが格納される循環バッファのインデックスを示す変数である。次に、制御部４３はwpの値をインクリメントする（Ｓ３０２）。
【００９７】
Ｓ３０２において、wpの値をインクリメントした結果、wpの値がN（バッファサイズ）になった場合は、制御部４３はwpに0を代入する。この処理は、循環バッファの最初のインデックスからストリームデータが格納されていき、最後のインデックスにデータが格納されたら、最初のインデックスに戻ってデータが格納されるときの、格納位置が最初のインデックスに戻る動作を示している。
【００９８】
次に、制御部４３はwpの値が0か否かを判定する（Ｓ３０３）。wpの値が0である場合は（Ｓ３０３でＹｅｓ）、循環バッファのすべてのインデックスにデータが一度以上格納されたことになるので、制御部４３はfirst_cycの値をfalseにする（Ｓ３０４）。そして処理はＳ３０５〜Ｓ３１０で示されるオフセット位置チェック処理に遷移する。また、Ｓ３０３においてwpの値が0でない場合（Ｓ３０３でＮｏ）、処理はＳ３０５〜Ｓ３１０で示されるオフセット位置チェック処理に遷移する。
【００９９】
処理Ｓ３０５〜Ｓ３１０のループで示されるオフセット位置チェックは、１回のループが各系列に対する処理を示しており、すべての系列に対して処理が繰り返される。すなわち、Ｓ３０５〜Ｓ３１０の処理（ループ）は、系列を示す変数iが0からK-1の間繰り返し行われ、各ループの最後にはiの値がインクリメントされる。
【０１００】
先ず制御部４３は、iの値が0以上でかつK-1以下であるか否かを判定する（Ｓ３０５）。iの値が0以上でかつK-1以下である場合、制御部４３はＳ３０６〜Ｓ３０９の処理を実行する。また、iの値がK-1より大きい場合、ループは終了し、処理が終了する。
【０１０１】
Ｓ３０６において、制御部４３は、pos[i]の値がwpと等しいか否かを判定する。ここで、pos[i]は、上述したように、系列iのオフセット位置に１を加えた値であり、wpは、Ｓ３０１で循環バッファに受信データを格納したときの格納位置を示す値がＳ３０２でインクリメントされた結果の値である。すなわち、Ｓ３０６では、Ｓ３０１における循環バッファの格納位置が、系列iのオフセット位置か否かの判定が行われる。
【０１０２】
Ｓ３０６において、pos[i]の値がwpと異なると判定された場合（Ｓ３０６でＮｏ）、処理はＳ３１０に遷移する。Ｓ３０６においてpos[i]の値がwpと等しいと判定した場合（Ｓ３０６でＹｅｓ）、制御部４３は、first_cycの値がtrueかfalseかを判定する（Ｓ３０７）。first_cycの値がtrueである場合（Ｓ３０７でＹｅｓ）、処理は書き出し処理１に遷移する（Ｓ３０８）。Ｓ３０７においてfirst_cycの値がfalseである場合（Ｓ３０７でＮｏ）、処理は書き出し処理２に遷移する（Ｓ３０９）。
【０１０３】
次に、書き出し処理１について詳しく説明する。書き出し処理１では、上述したように、最初に受信したストリームデータが循環バッファに格納されてから、一度目に循環バッファの最後のインデックスにデータが格納されるまでに実行される書き出し処理である。
【０１０４】
図１３は、書き出し処理１を説明するための図である。図１３（Ａ）は、循環バッファの要素のうち、一度もデータが格納されていない要素が存在する場合であって、循環バッファのオフセット位置に、ストリームデータが書き込まれた場合に実行されるときの書き出し処理１の例である。図１３（Ｂ）は、循環バッファの要素のうち、一度もデータが格納されていない要素が存在する場合であって、ストリームデータの終端が検知された時点で実行されるときの書き出し処理１の例である。図１３（Ａ）では、循環バッファのインデックス「0」からpos[i]-1のデータがまとめられブロックが生成される。図１３（Ａ）では、ブロックのサイズはpos[i]となる。図１３（Ｂ）では、循環バッファのインデックス「0」からwp-1のデータがまとめられ、ブロックが生成される。図１３（Ｂ）では、ブロックのサイズはwpとなる。
【０１０５】
図１４は、書き出し処理１の動作フローを示す。制御部４３は、循環バッファのインデックス「0」から格納位置（wp-1）までのデータをまとめて１つのブロックを生成する処理をＳ４０２〜Ｓ４０４のループ処理で行う。
【０１０６】
制御部４３は、先ず、書き出し対象のブロックにブロック番号を割り当てる（Ｓ４０１）。Ｓ４０１において、書き出し対象のブロックにはストリームデータは含まれていない。尚、ブロック番号は、各ブロックを一意に識別するための識別情報である。
【０１０７】
Ｓ４０２〜Ｓ４０４の処理ループは、Ｓ４０１において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
【０１０８】
先ず、制御部４３は、循環バッファに格納されたストリームデータのうち、書き出し対象ブロックに含めるデータのインデックスを指定するための変数jに0を代入する（Ｓ４０２）。そして、制御部４３は、buffer[j]に格納されたデータをＳ４０１で割り当てられたブロックに含める（Ｓ４０３）。そして、制御部４３はjの値をインクリメントし、jの値が0以上でかつwp-1以下であるか否かを判定する（Ｓ４０２）。jの値が0以上でかつwp-1である場合、処理がループし、再びＳ４０３が実行される。
【０１０９】
Ｓ４０２において、jの値が0未満またはwp以上である場合、ループは終了し、処理はＳ４０５に遷移する。
【０１１０】
Ｓ４０５において、制御部４３は、Ｓ４０１〜Ｓ４０４において生成された書き出し対象ブロックを系列iに対応する記憶装置４７に書き出す。
【０１１１】
そして、制御部４３は、書き出したブロックの情報をブロック区間ＤＢ４５の管理情報６０に格納する（Ｓ４０６）。すなわち、制御部４３は、管理情報６０の新たなレコードを作成し、作成したレコードのブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４に、Ｓ４０５において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
【０１１２】
次に、書き出し処理２について詳しく説明する。書き出し処理２では、上述したように、循環バッファの全てのインデックスに一度以上データが格納された後に、循環バッファのオフセット位置に、ストリームデータ受信部４１が受信したストリームデータが書き込まれた場合に実行される書き出し処理の例である。
【０１１３】
図１５は、書き出し処理２を説明するための図である。書き出し処理２では、制御部４３は、循環バッファのインデックスがpos[i]からN-1までのデータをインデックスの昇順にまとめ、さらに、インデックスがNに達した場合、Nに0を代入して、pos[i]-1までのデータを昇順にまとめて、ブロックの生成処理を行う。尚、ブロックのサイズはNとなる。
【０１１４】
図１６は書き出し処理２の動作フローを示す。制御部４３は、Ｓ５０２〜Ｓ５０４のループ処理において、循環バッファのデータをまとめて１つのブロックを生成する処理を行う。
【０１１５】
制御部４３は、先ず、書き出し対象のブロックにブロック番号を割り当てる（Ｓ５０１）。Ｓ５０１において、書き出し対象のブロックにはストリームデータは含まれていない。
【０１１６】
Ｓ５０２〜Ｓ５０４の処理ループは、Ｓ５０１において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。ここで、ブロックに循環バッファ内のストリームデータを含ませる処理は、時間の早いストリームデータから順に実行される。よって、ストリームデータは時間の早い順に、ブロックの先頭から配置される。
【０１１７】
制御部４３は、先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する（Ｓ５０２）。そして、制御部４３は、buffer[(wp+j)%N]に格納されたデータをＳ５０１で割り当てられたブロックに含める（Ｓ５０３）。ここで、(wp+j)%Nは、(wp+j)をNで割った余りである。そして、制御部４３はjの値をインクリメントし、jの値が0以上でかつN-1以下であるか否かを判定する（Ｓ５０２）。jの値が0以上でかつN-1以下である場合、処理がループし、再びＳ５０３が実行される。Ｓ５０２において、jの値が0未満またはN以上である場合、ループは終了し、処理はＳ５０５に遷移する。
【０１１８】
Ｓ５０５において、制御部４３は、Ｓ５０１〜Ｓ５０４において生成された書き出し対象ブロックを系列iに対応する記憶装置４７に書き出す。
【０１１９】
そして、制御部４３は、書き出したブロックの情報をブロック区間ＤＢ４５の管理情報６０に格納する（Ｓ５０６）。すなわち、制御部４３は、管理情報６０の新たなレコードを作成し、作成したレコードのブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４に、Ｓ５０５において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
【０１２０】
次に、制御部４３がストリームデータの終端データを検出した場合の動作について説明する。制御部４３はストリームデータが終端データであると検出すると、終端データを循環バッファに格納した時点で循環バッファに格納されているデータのうち、各系列の記憶装置４７に未だ格納されていないデータを、各系列に対応する記憶装置４７に格納する。
【０１２１】
図１７は、制御部４３がストリームデータの終端データを検出した場合の動作フロー図を示す。
【０１２２】
Ｓ６０１〜Ｓ６０７の処理は、すべての系列に対して繰り返し行われる。すなわち、Ｓ６０１〜Ｓ６０７の処理（ループ）は、系列を示す変数iが0からK-1の間繰り返し行われ、変数iは、各ループの最後（Ｓ６０７）においてインクリメントされる。
【０１２３】
先ず制御部４３は、循環バッファにおいて、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値よりも大きいか否かを判定する。具体的には、制御部４３はpos[i]の値がwpの値よりも大きいか否かを判定する（Ｓ６０２）。ここで、wpの値は終端データが格納されたインデックスに１加えた値とする。pos[i]の値がwpの値よりも大きい場合（Ｓ６０２でＹｅｓ）、制御部４３は、first_cycの値がtrueかfalseかを判定する（Ｓ６０３）。
【０１２４】
Ｓ６０３において、first_cycの値がtrueである場合（Ｓ６０３でＹｅｓ）、制御部４３は、書き出し処理１を実行する（Ｓ６０４）。この書き出し処理１は、図１４を参照して説明した書き出し処理１（Ｓ４０１〜Ｓ４０６）である。書き出し処理１の後、処理はＳ６０７に遷移する。
【０１２５】
Ｓ６０３において、first_cycの値がfalseである場合（Ｓ６０３でＮｏ）、制御部４３は、書き出し処理３を実行する（Ｓ６０６）。書き出し処理３の後、処理はＳ６０７に遷移する。
【０１２６】
Ｓ６０２において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値以下の場合、制御部４３は、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいか否かを判定する。言い換えると、Ｓ６０２においてpos[i]の値がwpの値以下の場合（Ｓ６０２でＮｏ）、制御部４３は、pos[i]の値がwpの値よりも小さいか否かを判定する（Ｓ６０５）。
【０１２７】
Ｓ６０５において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいと判定した場合、制御部４３は、書き出し処理３を実行する。すなわち、Ｓ６０５においてpos[i]の値がwpの値よりも小さいと判定した場合（Ｓ６０５でＹｅｓ）、制御部４３は、書き出し処理３を実行する（Ｓ６０６）。書き出し処理３が完了すると、処理はＳ６０７に遷移する。
【０１２８】
Ｓ６０５において、系列iのオフセット位置のインデックスの値が終端データの格納位置のインデックスの値以上であると判定された場合、すなわち、pos[i]の値がwpの値以上であると判定された場合（Ｓ６０５でＮｏ）、処理はＳ６０７に遷移する。
【０１２９】
図１８は、書き出し処理３を説明するための図である。書き出し処理３では、制御部４３は、循環バッファのインデックスがpos[i]からN-1までのデータをインデックスの昇順にまとめ、さらに、インデックスがNに達した場合、インデックスが0からwp-1まで昇順にまとめて、ブロックの生成処理を行う。尚、ブロックのサイズは(N-pos[i]+wp)%Nとなる。
【０１３０】
図１９は、書き出し処理３の動作フローを示す。制御部４３は、循環バッファのデータをまとめて１つのブロックを生成する処理を、Ｓ８０２〜Ｓ８０４のループ処理で行う。
【０１３１】
制御部４３は、先ず、書き出し対象のブロックにブロック番号を割り当てる（Ｓ８０１）。Ｓ８０１において、書き出し対象のブロックにはストリームデータは含まれていない。
【０１３２】
Ｓ８０２〜Ｓ８０４の処理ループは、Ｓ８０１において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
【０１３３】
制御部４３は、先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する（Ｓ８０２）。そして、制御部４３は、buffer[(pos[i]+j)%N]に格納されたデータをＳ８０１で割り当てられたブロックに含める（Ｓ８０３）。そして、制御部４３はjの値をインクリメントし、jの値が0以上でかつwp+N-pos[i]-1以下であるか否かを判定する（Ｓ８０２）。jの値が0以上でかつwp+N-pos[i]-1以下である場合、処理がループし、再びＳ８０３が実行される。Ｓ８０２において、jの値が0未満またはwp+N-pos[i]以上である場合、ループは終了し、処理はＳ８０５に遷移する。
【０１３４】
Ｓ８０５において、制御部４３は、Ｓ８０１〜Ｓ８０４において生成された書き出し対象ブロックを系列iに対応する記憶装置４７に書き出す。
【０１３５】
そして、制御部４３は、書き出したブロックの情報をブロック区間ＤＢ４５の管理情報６０に格納する（Ｓ８０６）。すなわち、制御部４３は、管理情報６０の新たなレコードを作成し、作成したレコードのブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４に、Ｓ８０５において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
【０１３６】
次に、冗長度を変化させる動作について説明する。
冗長度の変更は、制御部４３による書き込み処理が終了してから次のストリームデータを受信するまでのタイミングで行われる。すなわち、図１２のＳ３０５〜Ｓ３１０のループ処理が終了してから、次にＳ３０１の処理が実行されるまでの間、又は、図１７のＳ６０１〜Ｓ６０７のループ処理が終了してから、次に図１２のＳ３０１の処理が実行されるまでの間に実行される。冗長度の変更の影響は、変更処理が行われた後に受信したストリームデータに及ぶ。
【０１３７】
冗長度の変更は、冗長度の増加処理と、冗長度の減少処理に分けられる。
先ず、冗長度の増加処理について説明する。図２０は、冗長度の増加処理の動作フローを示す。
【０１３８】
図２０においては、冗長度Kがd（dは0より大きい整数）増加したときの、更新後の冗長度をK’とする。先ず制御部４３は、更新後の冗長度K’の値を初期化する。すなわち、制御部４３は、K’にK+dの値を代入する（Ｓ９０１）。そして、制御部４３はオフセット配列のKからK’-1までの要素を初期化する。すなわち、制御部４３は、pos[K]〜pos[K’-1]までの値にwpを代入する（Ｓ９０２〜Ｓ９０４）。
【０１３９】
次に、冗長度変更後の各系列のオフセット位置を、循環バッファにおいて等間隔で再配置するために使用される作業配列pos2[]を定義する。作業配列pos2[]の定義に先立ち、pos2[]を定義するために使用される変数eを定義し、eにN/K’を代入する（Ｓ９０５）。
【０１４０】
pos2[]は、要素数がK’の配列であり、各要素には添字に対応する系列のオフセット位置の情報が格納される。ここでオフセット位置は循環バッファにおいて等間隔に配置される。すなわち、系列を示す変数iが0以上でK’-1以下の間、pos2[i]=i*eの処理が繰り返し行われる。各ループの最後にiの値がインクリメントされる（Ｓ９０６〜Ｓ９０８）。
【０１４１】
次に、冗長度変更前までに循環バッファ内に格納されたデータを記憶装置４７に書き出す処理が行われる（Ｓ９０９）。具体的には、制御部４３がストリーム終端を検出した場合と同じ処理が行われる。すなわち、図１７のＳ６０１〜Ｓ６０７の処理が実行される。
【０１４２】
次に、制御部４３は、オフセット配列pos[]にＳ９０６〜Ｓ９０８で定義した作業配列pos2[]をコピーする（Ｓ９１０）。すなわち、制御部４３は、pos[0]にpos2[0]の値を代入し、pos[1]にpos2[1]の値を代入し、・・・のように、pos[]の各要素に、添字が対応するpos2[]の各要素の値を代入する。尚、pos2[]に対応するpos[]の要素がない場合は、pos[]の要素が新たに作成され、pos2[]の値が代入される。例えば、pos[K’-1]にはpos2[K’-1]の値が代入されることとなる。よって代入後のpos[]の要素数は、K’となる。
【０１４３】
そして、制御部４３は、循環バッファの格納位置を示す変数wpの値に0を代入する（Ｓ９１１）。これは、循環バッファの冗長度変更処理後は、再び循環バッファのインデックスが0の位置から受信したストリームデータが格納されていくことを示している。
【０１４４】
尚、Ｓ９０１〜９０８とＳ９０９は順序が前後してもよいし、Ｓ９１１は、Ｓ９０１〜Ｓ９１０のいずれかの前または後で実行されればよい。
【０１４５】
次に、冗長度の減少処理について説明する。図２１は、冗長度の減少処理の動作フローを示す。
【０１４６】
図２１においては、冗長度Kが1減少した場合の動作フローを示す。冗長度Kがd減少した場合は、図２１の動作フローをd回繰り返す。
【０１４７】
先ず、制御部４３は、各系列（0〜K-1）のうち、循環バッファに最も多くの未書き込みデータが格納されている系列iを決定する（Ｓ１００１）。ここで、未書き込みデータは、循環バッファに格納されているデータのうち、記憶装置４７に対して一度も書き出し処理が行われていないデータを指す。各系列間で、未書き込みデータが最も多いとは、未書き込みデータが格納されている領域のインデックスの合計数が最も多い系列を指す。
【０１４８】
次に、制御部４３は、系列iに対して、ストリーム終端を受信した場合の処理を実行する（Ｓ１００２）。すなわち、図１７のＳ６０１〜Ｓ６０７の処理が実行される。
【０１４９】
次に、制御部４３は、オフセット配列pos[]の位置iを詰める（削除する）（Ｓ１００３）。例えば、pos[i]にpos[i+1]の値を代入し、pos[i+1]にpos[i+2]の値を代入し、・・・、pos[K-2]にpos[K-1]の値を代入し、pos[K-1]の値を削除する処理が行われる。
【０１５０】
Ｓ１００１〜Ｓ１００３の処理により、更新後の冗長度K’はK-1となる。さらに、Ｓ１００１〜Ｓ１００３をd回繰り返すことにより、冗長度をd減少させることができる。
【０１５１】
尚、Ｓ１００３の後に、図２０のＳ９０５〜Ｓ９１１で示した処理を行い、オフセット配列を循環バッファにおいて均等に配置するようにしてもよい。
【０１５２】
ストリームの時間区間ごとのデータの重要度に応じて、図２０または図２１で示した冗長度の変更処理を行うことにより過剰な冗長化を防ぐことができるが、データの重要度はストリームデータの実時間入力後に確定するものが多い。そこで、制御部４３は既に一度記憶装置４７に格納済のブロックに対して、重要度に応じた冗長度に変更する再冗長化処理を行う。再冗長化処理は、記憶装置４７に格納されたブロックを読み出し、再生処理時の頭出し性能やメモリ使用量を最適化するようにブロックのサイズの変更や冗長度の変更が行われる。
【０１５３】
次に、再冗長化処理の動作について詳しく説明する。図２２は、再冗長化処理の動作フローを示す。
【０１５４】
先ず、制御部４３は、再冗長化対象の区間を決定する（Ｓ１１０１）。ここで、区間とは、ストリームデータの時系列で連続な所定の範囲を指す。再冗長化対象の区間の決定は、例えばストリームデータの重要度に基づいて行われる。例えば、制御部４３は、ストリームデータの各時刻における重要度を取得し、重要度が一定の値である範囲に基づいて再冗長化を行う区間を決定する。具体的には、重要度がＡ、Ｂ、Ｃの３段階で表される場合、制御部４３は重要度がＡ（一定）である連続する区間を再冗長化対象の区間として決定してもよい。また、例えば、頭出し再生の開始時点となりえない区間を再冗長化対象の区間としてもよい。
【０１５５】
再冗長化対象の区間が決定され、再冗長化対象の区間の開始時刻と終了時刻が決まると、制御部４３は、その区間に存在するデータを含む複数のブロックをブロック区間ＤＢ４５で検索する（Ｓ１１０２）。
【０１５６】
図２３は、再冗長化対象の区間に存在するデータを含む複数のブロックの例を示す。図２３において、再冗長化開始位置から再冗長化終了位置までに存在するデータを含むブロックは、｛a、b、c、d、e、f、g｝である。
【０１５７】
次に、制御部４３は、再冗長化を行うブロックの組み合わせを決定する（Ｓ１１０３）。具体的には、制御部４３は、頭出しを用いた読み出し性能やメモリ使用量の評価関数に基づいて、最適または近似解でブロック組合せを導出する。図２３の例の場合、開始位置から終了位置までのデータを読み出す場合には、｛a、b、c｝のブロック読み出し以外にも、｛d、e、f｝、｛d、f、g｝、等のブロックの組み合わせがある。制御部４３は、これらの組み合わせのうち、組合せ最適化の種々の技術を用いて最適な組み合わせを導出する。例えば、再冗長化対象区間においてできるだけデータに重複がなく、時間の幅を満たす組み合わせを導出するようにしてもよい。
【０１５８】
次に、制御部４３は、Ｓ１１０３で決定した組み合わせのブロックを循環バッファに読み出す（Ｓ１１０４）。尚、ブロックの読み出しは、循環バッファでなく、所定の記憶領域でもよい。
【０１５９】
そして、制御部４３は、Ｓ１１０４で読み出した複数のブロックにおいて、ブロックの重複部分を削除し、または、複数のブロックを連結することにより、新しいブロックを生成して、生成したブロックを記憶装置４７に格納する（Ｓ１１０５）。
【０１６０】
既に記憶装置４７に格納されたブロックを読みだして、再冗長化開始位置から開始終了までのストリームを生成し、生成したストリームに対して、図２０及び図２１を参照して説明した冗長度の変更処理を適用してもよい。これにより、再冗長化開始位置から開始終了までのデータを、ストリームデータを記憶装置４７に格納した後で決定した冗長度に変更することができる。
【０１６１】
また、以下のように再冗長化処理を行うこともできる。すなわち、先ず、情報処理装置は、既に記憶装置４７に格納されたブロックを読み出して、再冗長化開始位置から開始終了までのストリームを生成する。そして、情報処理装置は、生成したストリームに対して、前回格納時と異なるブロックサイズNを用いて、図１２〜図１９を参照して説明したのと同様のブロックの書き出し処理を行う。このようにすることで、再冗長化開始位置から開始終了までのデータを、ストリームデータを記憶装置４７に格納した後で決定したブロックサイズに変更することができる。
【０１６２】
図２４は、データの再生時の動作フローを示す。
先ず、リクエスト受信部５１は再生要求を受信する（Ｓ１２０１）。再生要求には、再生要求対象の再生開始時刻と再生終了時刻が含まれる。
【０１６３】
次に、制御部５２は、受信した再生要求に含まれる再生開始時刻を、再生要求対象のストリームデータを含むブロックを取得するために使用される作業用変数である指定時刻に指定する（Ｓ１２０２）。
【０１６４】
次に、制御部５２は、記憶装置５９に格納された複数のブロックのうち、開始時刻が、指定時刻より以前の時刻であり且つ最も指定時刻に近いブロックを、ブロック区間ＤＢ５４から検索する（Ｓ１２０３）。具体的には、制御部５２は、ブロック区間ＤＢ５４に記憶される管理情報６０の開始時刻６２を参照し、指定時刻より以前の時刻であり、且つ最も指定時刻に近いレコードを検索する。
【０１６５】
次に、制御部５２は、リクエスト送信部５５を介して、記憶装置５９にブロックの読み込み要求を送信し、ブロックを取得する（Ｓ１２０４）。具体的には、制御部５２は、Ｓ１２０３で検索したレコードの系列番号６４の系列に対応する記憶装置５９に対して、ブロック番号６１のブロックの取得要求を行う。ブロックの取得要求を受信した記憶装置５９は、ブロック番号で指定されたブロックを情報処理装置５０に送信する。情報処理装置５０は、ブロック受信部５６を介して記憶装置５９から取得要求したブロックを受信する。
【０１６６】
次に、制御部５２は、再生区間を覆うのに十分な長さのブロックが全て得られたか否かを判定する（Ｓ１２０５）。すなわち、制御部５２は、Ｓ１２０４で取得したブロックのうちのいずれかの終了時刻が、再生要求に含まれる再生終了時刻よりも後であれば、再生区間を覆うのに十分な長さのブロックが全て得られたと判定する。
【０１６７】
Ｓ１２０５において、再生区間を覆うのに十分な長さのブロックが全て得られていないと判定した場合（Ｓ１２０５でＮｏ）、制御部５２はＳ１２０４において取得した複数のブロックの終了時刻のうち、最も遅い終了時刻を新たに指定時刻に指定する（Ｓ１２０６）。そして、処理はＳ１２０３に遷移する。
【０１６８】
Ｓ１２０５において、再生区間を覆うのに十分な長さのブロックが全て得られたと判定した場合（Ｓ１２０５でＹｅｓ）、制御部５２は、Ｓ１２０４で取得した複数のブロックにおいて、時刻が重複しているストリームデータを削除し、再生ストリームを生成する。そして、制御部５２は、再生ストリームを再生処理の要求元の端末に対して送信する（Ｓ１２０７）。そして、処理は終了する。
【０１６９】
（実施形態２）
実施形態１は、冗長度の変更処理において、オフセット位置が変更される前に循環バッファの中身が全てブロックとして掃出され（Ｓ９０９）、その後の処理は、循環バッファの格納位置wpは0から開始される。そのため、冗長度の変更処理の直前または直後に書き出されるブロックのサイズは、冗長度の変更処理がない場合に比べて小さくなる。
【０１７０】
そこで、実施形態２では、冗長度の変更処理において、現在の格納位置wp、系列i毎の未書き出しデータ量、更新前オフセット、更新後オフセットを考慮し、循環バッファの内容を全て書き出さないようにしてオフセット位置を更新する。これにより、冗長度変更時の書き出し処理を削減し、サイズが小さなブロックが格納される頻度を減少させる。
【０１７１】
実施形態２では、循環バッファの開始点とfirst_cycの値を系列毎に管理する。図２５は、実施形態２に係る書き出し処理の制御変数である、系列番号７１、区切り位置７２、１周目フラグ７３、開始点７４の関係を示す情報の一例である。
【０１７２】
系列番号７１は、各系列を一意に識別するための情報である。区切り位置７２は、系列番号７１に対応する系列のオフセット位置の情報である。１周目フラグは、系列番号７１に対応する系列の１周目フラグの情報である。１周目フラグは実施形態１で説明したものと同様である。ただし、実施形態２では、系列毎に開始位置が異なるため、１周目フラグの値も系列毎に異なる。開始点７４は、系列番号７１に対応する系列の循環バッファにおける開始位置を示す情報である。開始点７４は、配列start[]の値で示され、系列iの開始位置をstart[i]として表す。実施形態１では、開始位置は全ての系列でインデックス0であった。すなわち、start[i]はブロックiに拠らず常に0であった。実施形態２においては、系列毎にstart[i]の値が異なる場合がある。
【０１７３】
実施形態２に係る書き出し処理、読み込み処理に関する情報処理装置の構成は、実施形態１において、図７及び図８を参照して説明したものと同様である。
【０１７４】
図２６は、実施形態２に係る、ブロックの生成と記憶装置への書き出し処理の動作フローを示す。
【０１７５】
図２６においては、循環バッファのバッファサイズをN、循環バッファをbuffer[]、冗長度をK、系列毎のオフセット位置に１加えた値が格納された配列をpos[]とする。さらに、ストリームデータ受信部４１による循環バッファへのデータの格納位置のインデックスを示す変数をwpとする。また、循環バッファのすべてのインデックスに少なくとも一度情報が格納されたか否かを示す変数が格納された配列を１周目フラグ配列first_cyc[K]とする。
【０１７６】
循環バッファbuffer[]、オフセット配列pos[]、格納位置wpは、実施形態１で説明したものと同じであるため、説明は省略する。
【０１７７】
１周目フラグ配列first_cyc[]は、系列毎の１周目フラグが各要素に格納された配列である。
【０１７８】
変数の初期化処理として、制御部４３は、格納位置wpに0を代入し、１周目フラグ配列first_cyc[]の全ての要素にtrueを代入する。また、制御部４３は、オフセット配列pos[]のそれぞれの要素に各系列のオフセット位置に１加えた値を格納する。
【０１７９】
変数の初期化処理の後、制御部４３は、ストリームデータを受信する毎に、Ｓ１３０１〜Ｓ１３１０の処理を実行する。Ｓ１３０１〜Ｓ１３１０の１回のループは、ストリームデータ受信部４１が１つのストリームデータを受信する毎に実行される処理であり、循環バッファの１つのインデックスにストリームデータが格納される処理である。また、１回のループが完了する毎に、循環バッファにおける格納位置wpは１つずつ進む。そして、循環バッファの最終インデックスにデータが格納される処理ループが終了すると、次のループでは、最初のインデックスにデータが格納されるループに戻る。
【０１８０】
制御部４３は、ストリームデータを受信すると、buffer[wp]に受信したデータを格納する（Ｓ１３０１）。ここで、上述したように、wpはストリームデータが格納される循環バッファのインデックスを示す変数である。次に、制御部４３はwpの値をインクリメントする（Ｓ１３０２）。
【０１８１】
Ｓ１３０２において、格納位置wpの値をインクリメントした結果、wpの値がN（バッファサイズ）になった場合は、制御部４３はwpに0を代入する。この処理は、循環バッファの最初のインデックスからストリームデータが格納されていき、最後のインデックスにデータが格納されたら、最初のインデックスに戻ってデータが格納されるときの、格納位置が最初のインデックスに戻る動作を示している。
【０１８２】
次に、制御部４３は、すべての系列に対して、Ｓ１３０３〜Ｓ１３１０の書き出し処理を繰り返す。すなわち、Ｓ１３０３〜Ｓ１３１０の処理（ループ）は、系列を示す変数iが0からK-1の間繰り返し行われ、各ループの最後にはiの値がインクリメントされる。
【０１８３】
書き出し処理のループにおいて、先ず制御部４３は、wpの値がstart[i]と等しいか否かを判定する（Ｓ１３０４）。wpの値とstart[i]の値が等しい場合は（Ｓ１３０４でＹｅｓ）、start[i]を開始位置としたときに循環バッファのすべてのインデックスにデータが一度以上格納されたことになるので、制御部４３はfirst_cyc[i]の値をfalseにする（Ｓ１３０５）。そして処理はＳ１３０６に遷移する。また、Ｓ１３０４においてwpの値がstart[i]と等しくない場合（Ｓ１３０４でＮｏ）、処理はＳ１３０６に遷移する。
【０１８４】
次に、制御部４３は、pos[i]の値がwpと等しいか否かを判定する（Ｓ１３０６）。ここで、pos[i]は、上述したように、系列iのオフセット位置に１を加えた値であり、wpは、Ｓ１３０１で循環バッファに受信データを格納したときの格納位置を示す値がＳ１３０２でインクリメントされた結果の値である。すなわち、Ｓ１３０６では、Ｓ１３０１における循環バッファの格納位置が系列iのオフセット位置か否かの判定が行われる。
【０１８５】
Ｓ１３０６において、pos[i]の値がwpと異なると判定された場合（Ｓ１３０６でＮｏ）、処理はＳ１３１０に遷移する。Ｓ１３０６においてpos[i]の値がwpと等しいと判定した場合（Ｓ１３０６でＹｅｓ）、制御部４３は、first_cyc[i]の値がtrueかfalseかを判定する（Ｓ１３０７）。first_cyc[i]の値がtrueである場合（Ｓ１３０７でＹｅｓ）、処理は書き出し処理４に遷移する（Ｓ１３０８）。Ｓ１３０７においてfirst_cyc[i]の値がfalseである場合（Ｓ１３０７でＮｏ）、処理は書き出し処理５に遷移する（Ｓ１３０９）。
【０１８６】
次に、書き出し処理４について説明する。書き出し処理４では、ストリームデータがstart[i]に一度目に格納されてから、一度目に循環バッファの最後のインデックスにデータが格納されるまでに実行される書き出し処理である。
【０１８７】
図２７は、書き出し処理４の動作フローを示す。制御部４３は、循環バッファのインデックスstart[i]から(wp+N-start[i]+1)%Nまでのデータをまとめて１つのブロックを生成する処理をＳ１４０２〜Ｓ１４０４のループ処理において行う。
【０１８８】
制御部４３は、先ず、書き出し対象のブロックにブロック番号を割り当てる（Ｓ１４０１）。Ｓ１４０１において、書き出し対象のブロックにはストリームデータは含まれていない。
【０１８９】
Ｓ１４０２〜Ｓ１４０４の処理ループは、Ｓ１４０１においてブロック番号を割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
【０１９０】
ここで、ブロックに循環バッファ内のストリームデータを含ませる処理は、時間の早いストリームデータから順に実行される。よって、ストリームデータが時間の早い順にブロックの先頭から配置される。
【０１９１】
先ず、制御部４３は、バッファに格納されたストリームデータのうち、書き出し対象ブロックに含めるデータのインデックスを指定するための変数jに0を代入する（Ｓ１４０２）。そして、制御部４３は、buffer[(start[i]+j)%N]に格納されたデータをＳ１４０１で割り当てられたブロックに含める（Ｓ１４０３）。そして、制御部４３はjの値をインクリメントし、jの値が0以上でかつ(wp+N-start[i]+1)%N以下であるか否かを判定する（Ｓ１４０２）。jの値が0以上でかつ(wp+N-start[i]+1)%N以下である場合、処理がループし、再びＳ１４０３が実行される。
【０１９２】
Ｓ１４０２において、jの値が0未満または(wp+N-start[i]+1)%N+1以上である場合、ループは終了し、処理はＳ１４０５に遷移する。
【０１９３】
Ｓ１４０５において、制御部４３は、Ｓ１４０１〜Ｓ１４０４において生成された書き出し対象ブロックを系列iに対応する記憶装置４７にブロック送信部４６を介して書き出す処理を行う。
【０１９４】
そして、制御部４３は、書き出したブロックの情報をブロック区間ＤＢ４５の管理情報６０に格納する（Ｓ１４０６）。すなわち制御部４３は、管理情報６０の新たなレコードを作成し、作成したレコードのブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４に、Ｓ１４０５において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
【０１９５】
次に、書き出し処理５について説明する。書き出し処理５では、循環バッファの全てのインデックスに一度以上データが格納された後に、循環バッファのオフセット位置にストリームデータ受信部４１が受信したストリームデータが書き込まれた場合に実行される書き出し処理の例である。
【０１９６】
図２８は書き出し処理５の動作フローを示す。制御部４３は、Ｓ１５０２〜Ｓ１５０４のループ処理において、循環バッファのデータをまとめて１つのブロックを生成する処理を行う。
【０１９７】
制御部４３は、先ず、書き出し対象のブロックにブロック番号を割り当てる（Ｓ１５０１）。Ｓ１５０１において、書き出し対象のブロックにはストリームデータは含まれていない。
【０１９８】
Ｓ１５０２〜Ｓ１５０４の処理ループは、Ｓ１５０１において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
【０１９９】
ループにおいて、制御部４３は先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する（Ｓ１５０２）。そして、制御部４３は、buffer[(wp+j)%N]に格納されたデータをＳ１５０１で割り当てられたブロックに含める（Ｓ１５０３）。そして、制御部４３はjの値をインクリメントし、jの値が0以上でかつN-1以下であるか否かを判定する（Ｓ１５０２）。jの値が0以上でかつN-1以下である場合、処理がループし、再びＳ１５０３が実行される。Ｓ１５０２において、jの値が0未満またはN以上である場合、ループは終了し、処理はＳ１５０５に遷移する。
【０２００】
Ｓ１５０５において、制御部４３は、Ｓ１５０１〜Ｓ１５０４において生成された書き出し対象ブロックを系列iに対応する記憶装置４７にブロック送信部４６を介して書き出す処理を行う。
【０２０１】
そして、制御部４３は、書き出したブロックの情報をブロック区間ＤＢ４５の管理情報６０に格納する（Ｓ１５０６）。すなわち、制御部４３は管理情報６０の新たなレコードを作成し、作成したレコードのブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４に、Ｓ１５０５において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
【０２０２】
次に、制御部４３がストリームデータの終端データを検出した場合の動作について説明する。制御部４３はストリームデータが終端データであると検出すると、終端データを循環バッファに格納した時点で循環バッファに格納されているデータのうち、各系列の記憶装置４７に未だ格納されていないデータを格納する処理を行う。
【０２０３】
図２９は、制御部４３がストリームデータの終端データを検出した場合の動作フロー図を示す。
【０２０４】
Ｓ１６０１〜Ｓ１６０７の処理は、すべての系列に対して繰り返し行われる。すなわち、Ｓ１６０１〜Ｓ１６０７の処理（ループ）は、系列を示す変数iが0からK-1の間繰り返し行われ、変数iは、各ループの最後（Ｓ１６０７）においてインクリメントされる。
【０２０５】
先ず制御部４３は、循環バッファにおいて、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値よりも大きいか否かを判定する。具体的には、制御部４３はpos[i]の値がwpの値よりも大きいか否かを判定する（Ｓ１６０２）。ここで、wpの値は終端データが格納されたインデックスに１加えた値とする。pos[i]の値がwpの値よりも大きい場合（Ｓ１６０２でＹｅｓ）、制御部４３は、first_cyc[i]の値がtrueかfalseかを判定する（Ｓ１６０３）。
【０２０６】
Ｓ１６０３において、first_cyc[i]の値がtrueである場合（Ｓ１６０３でＹｅｓ）、制御部４３は、書き出し処理４を実行する（Ｓ１６０４）。この書き出し処理４は、図２７を参照して説明した書き出し処理４（Ｓ１４０１〜Ｓ１４０６）である。書き出し処理４の後、処理はＳ１６０７に遷移する。
【０２０７】
Ｓ１６０３において、first_cyc[i]の値がfalseである場合（Ｓ１６０３でＮｏ）、制御部４３は、書き出し処理６を実行する（Ｓ１６０６）。書き出し処理６の後、処理はＳ１６０７に遷移する。
【０２０８】
Ｓ１６０２において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値以下の場合、制御部４３は、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいか否かを判定する。言い換えると、Ｓ６０２においてpos[i]の値がwpの値以下の場合（Ｓ１６０２でＮｏ）、制御部４３は、pos[i]の値がwpの値よりも小さいか否かを判定する（Ｓ１６０５）。
【０２０９】
Ｓ１６０５において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいと判定した場合、制御部４３は、書き出し処理６を実行する。すなわち、Ｓ１６０５においてpos[i]の値がwpの値よりも小さいと判定した場合（Ｓ１６０５でＹｅｓ）、制御部４３は、書き出し処理６を実行する（Ｓ１６０６）。書き出し処理６が完了すると、処理はＳ１６０７に遷移する。
【０２１０】
Ｓ１６０５において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値以上であると判定された場合、すなわち、pos[i]の値がwpの値以上であると判定された場合（Ｓ１６０５でＮｏ）、処理はＳ１６０７に遷移する。
【０２１１】
次に、書き出し処理６の動作について説明する。書き出し処理６は、循環バッファに格納したデータが終端データであると制御部４３が判定した時点で、系列iの開始位置にデータが格納されてから既に全ての要素にデータが格納された後である場合に実行される書き出し処理である。言い換えると、書き出し処理６は、循環バッファに格納したデータが終端データであると制御部４３が判定した時点で、系列iの開始位置にデータが格納されてから循環バッファの格納位置wpが循環バッファを１周した後である場合に実行される書き出し処理である。
【０２１２】
図３０は、書き出し処理６の動作フローを示す。制御部４３は、Ｓ１７０２〜Ｓ１７０４のループ処理において循環バッファのデータをまとめて１つのブロックを生成する。
【０２１３】
制御部４３は、先ず、書き出し対象のブロックにブロック番号を割り当てる（Ｓ１７０１）。Ｓ１７０１においては、書き出し対象のブロックにはストリームデータは含まれていない状態である。
【０２１４】
Ｓ１７０２〜Ｓ１７０４の処理ループは、Ｓ１７０１においてブロック番号を割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
【０２１５】
制御部４３は、先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する（Ｓ１７０２）。そして、制御部４３は、buffer[(pos[i]+j)%N]に格納されているデータをＳ１７０１で割り当てられたブロックに含める（Ｓ１７０３）。そして、制御部４３はＳ１７０４に処理を進める。すなわち、処理はＳ１７０２に戻る。すると、制御部４３はjの値をインクリメントし、jの値が0以上でかつwp+N-pos[i]-1以下であるか否かを判定する（Ｓ１７０２）。jの値が0以上でかつwp+N-pos[i]-1以下である場合、再びＳ１７０３が実行される。Ｓ１７０２において、jの値が0未満またはwp+N-pos[i]以上である場合、ループは終了し、制御部４３はＳ１７０５に処理を進める。
【０２１６】
Ｓ１７０５において、制御部４３は、Ｓ１７０１〜Ｓ１７０４において生成された書き出し対象ブロックを系列iに対応する記憶装置４７にブロック送信部４６を介して書き出す処理を行う。
【０２１７】
そして、制御部４３は、書き出したブロックの情報をブロック区間ＤＢ４５の管理情報６０に格納する（Ｓ１７０６）。すなわち、制御部４３は、管理情報６０の新たなレコードを作成し、作成したレコードのブロック番号６１、開始時刻６２、終了時刻６３、系列番号６４に、Ｓ１７０５において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
【０２１８】
次に、冗長度を変化させる動作について説明する。ここでは、系列iのオフセット配列の値がpos[i]からpos’[i]に変更される場合を説明する。図３１は、実施形態２に係るオフセット位置変更時の動作フローを示す。
【０２１９】
先ず、制御部４３は、pos[i]がwpより大きいか否かを判定する（Ｓ１８０１）。pos[i]がwpより大きいと判定した場合（Ｓ１８０１でＹｅｓ）、制御部４３は、first_cyc[i]の値がtrueかfalseかを判定する（Ｓ１８０２）。first_cyc[i]の値がtrueである場合（Ｓ１８０２でＹｅｓ）、処理は変更処理１に遷移する（Ｓ１８０３）。変更処理１については、図３２を参照して後ほど説明する。
【０２２０】
Ｓ１８０２において、first_cyc[i]の値がfalseであると判定された場合（Ｓ１８０２でＮｏ）、処理はＳ１８０５に遷移する。
【０２２１】
Ｓ１８０１において、pos[i]がwp以下であると判定した場合（Ｓ１８０１でＮｏ）、制御部４３は、pos[i]がwpより小さいか否かを判定する（Ｓ１８０４）。pos[i]がwp以上であると判定された場合（Ｓ１８０４でＮｏ）、処理は終了する。
【０２２２】
Ｓ１８０４において、pos[i]がwpより小さいと判定された場合（Ｓ１８０４でＹｅｓ）、処理はＳ１８０５に遷移する。
【０２２３】
Ｓ１８０５では、制御部４３は、循環バッファにおいて、pos[i]、pos’[i]、wpが時計回りにこの順で並ぶか否かを判定する（Ｓ１８０５）。ここで、時計回りとは、図１０で示した循環バッファにおける時計回りのように、循環バッファのインデックスの値が増加する方向を指す。尚、インデックスの値が0を挟んでいても、順序関係は保持されるものとする。例えば、「pos[i]、pos’[i]、wpが時計回りにこの順で並ぶ」には、pos[i]とpos’[i]の間にインデックス0の領域が存在する場合も含まれる。循環バッファにおいて、時計回りにpos[i]、pos’[i]、wpの順で並ぶと判定した場合（Ｓ１８０５でＹｅｓ）、制御部４３は、pos[i]からpos’[i]までのデータの書き出し処理を行う（Ｓ１８０６）。そして、処理は終了する。
【０２２４】
Ｓ１８０５において、時計回りにpos[i]、pos’[i]、wpの順で並んでいないと判定した場合（Ｓ１８０５でＮｏ）、制御部４３は、循環バッファにおいて、時計まわりにpos[i]、wp、pos’[i]の順序に並ぶか否かを判定する（Ｓ１８０７）。時計まわりにpos[i]、wp、pos’[i]の順序に並ぶと判定した場合（Ｓ１８０７でＹｅｓ）、制御部４３は、first_cyc[i]にtrueを設定し、start[i]にpos[i]の値を設定する（Ｓ１８０８）。そして、処理は終了する。
【０２２５】
Ｓ１８０７において、時計まわりにpos[i]、wp、pos’[i]の順序に並んでいないと判定された場合（Ｓ１８０７でＮｏ）、処理は終了する。
【０２２６】
次に、Ｓ１８０３で実行される変更処理１について説明する。図３２は、実施形態２に係る変更処理１の動作フローを示す。
【０２２７】
制御部４３は、循環バッファにおいて、時計まわりに、pos[i]、pos’[i]、wpの順序に並ぶか否かを判定する（Ｓ１９０１）。制御部４３が、時計まわりに、pos[i]、pos’[i]、wpの順序に並んでいないと判定した場合（Ｓ１９０１でＮｏ）、処理は変更処理２に遷移する（Ｓ１９０２）。変更処理２については、図３３を参照して後ほど説明する。
【０２２８】
Ｓ１９０１において、時計まわりに、pos[i]、pos’[i]、wpの順序に並ぶと判定した場合（Ｓ１９０１でＹｅｓ）、制御部４３は、循環バッファにおいて、時計まわりに、start[i]、pos[i]、pos’[i]、wpの順に並ぶか否かを判定する（Ｓ１９０３）。そして時計まわりに、start[i]、pos[i]、pos’[i]、wpの順に並ぶと判定した場合（Ｓ１９０３でＹｅｓ）、制御部４３は、pos[i]からpos’[i]までのデータの書き出し処理を行う（Ｓ１９０４）。そして処理は終了する。
【０２２９】
Ｓ１９０３において、時計まわりに、start[i]、pos[i]、pos’[i]、wpの順に並ばないと判定した場合（Ｓ１９０３でＮｏ）、制御部４３は、循環バッファにおいて、時計まわりに、pos[i]、start[i]、pos’[i]、wpの順に並ぶか否かを判定する（Ｓ１９０５）。時計まわりに、pos[i]、start[i]、pos’[i]、wpの順に並ぶと判定した場合（Ｓ１９０５でＹｅｓ）、制御部４３は、start[i]からpos’[i]までのデータの書き出し処理を行う（Ｓ１９０６）。そして処理は終了する。
【０２３０】
Ｓ１９０５において、時計まわりに、pos[i]、start[i]、pos’[i]、wpの順に並ばないと判定した場合（Ｓ１９０５でＮｏ）、制御部４３は、循環バッファにおいて、時計まわりに、pos[i]、pos’[i]、wp、start[i]の順に並ぶか否かを判定する（Ｓ１９０７）。時計まわりに、pos[i]、pos’[i]、wp、start[i]の順に並ぶと判定した場合（Ｓ１９０７でＹｅｓ）、制御部４３は、pos[i]からpos’[i]までのデータの書き出し処理を行う（Ｓ１９０８）。そして処理は終了する。
【０２３１】
Ｓ１９０７において、時計まわりに、pos[i]、pos’[i]、wp、start[i]の順に並ばないと判定された場合（Ｓ１９０７でＮｏ）、処理は終了する。
【０２３２】
次に、Ｓ１９０２で実行される変更処理２について説明する。図３３は、実施形態２に係る変更処理２の動作フローを示す。
【０２３３】
制御部４３は、循環バッファにおいて、pos[i]、wp、pos’[i]が時計まわりにこの順序に並ぶか否かを判定する（Ｓ２００１）。制御部４３が、時計まわりに、pos[i]、wp、pos’[i]の順序に並んでいないと判定した場合（Ｓ２００１でＮｏ）、処理は終了する。
【０２３４】
Ｓ２００１において、時計まわりに、pos[i]、wp、pos’[i]の順序に並ぶと判定した場合（Ｓ２００１でＹｅｓ）、制御部４３は、循環バッファにおいて、時計まわりに、start[i]、pos[i]、wp、pos’[i]の順に並ぶか否かを判定する（Ｓ２００２）。時計まわりに、start[i]、pos[i]、wp、pos’[i]の順に並ぶと判定した場合（Ｓ２００２でＹｅｓ）、制御部４３は、start[i]の値にpos[i]の値を設定する（Ｓ２００３）。そして処理は終了する。
【０２３５】
Ｓ２００２において、時計まわりに、start[i]、pos[i]、wp、pos’[i]の順に並ばないと判定した場合（Ｓ２００２でＮｏ）、制御部４３は、循環バッファにおいて、時計まわりに、pos[i]、wp、start[i]、pos’[i]の順に並ぶか否かを判定する（Ｓ２００４）。時計まわりに、pos[i]、wp、start[i]、pos’[i]の順に並ぶと判定した場合（Ｓ２００４でＹｅｓ）、制御部４３は、start[i]にpos[i]の値を設定する（Ｓ２００３）。そして処理は終了する。
【０２３６】
Ｓ２００４において、時計まわりに、pos[i]、wp、start[i]、pos’[i]の順に並ばないと判定した場合（Ｓ２００４でＮｏ）、制御部４３は、循環バッファにおいて、時計まわりに、pos[i]、wp、pos’[i]、start[i]の順に並ぶか否かを判定する（Ｓ２００６）。時計まわりに、pos[i]、wp、pos’[i]、start[i]の順に並ぶと判定した場合（Ｓ２００６でＹｅｓ）、制御部４３は、start[i]の値にpos[i]の値を設定する（Ｓ２００３）。そして処理は終了する。
【０２３７】
Ｓ２００６において、時計まわりに、pos[i]、wp、pos’[i]、start[i]の順に並ばないと判定した場合（Ｓ２００６でＮｏ）、処理は終了する。
【０２３８】
尚、冗長度が増加した場合、追加した系列に対応する変更前のオフセット位置は存在しないが、追加した系列の開始位置と１周目フラグの値は初期状態とする。すなわち、追加した系列をiとすると、start[i]にwpが設定され、first_cyc[i]にtrueが設定された状態となる。
【０２３９】
また、冗長度が減少した場合、削除した系列の変更後のオフセット位置は存在しなくなるが、削除した系列に対しては、ストリーム終端を受信した場合の書き出し処理を行う。すなわち、削除した系列をiとすると、pos[i]に対して図２９のＳ１６０１〜Ｓ１６０７の処理が行われる。
【０２４０】
尚、first_cyc[i]がtrueであり、且つ循環バッファにおいて、pos[i]、pos’[i]、wpが時計まわりにこの順序に並ぶときであって、時計まわりに、pos[i]、pos’[i]、start[i]、wpの順となる場合には何も処理は行われない。また、first_cyc[i]がtrueであり、且つ循環バッファにおいて、pos[i]、wp、pos’[i]が時計まわりにこの順序に並ぶときであって、時計まわりに、pos[i]、start[i]、wp、pos’[i]の順となる場合も何も処理は行われない。
【０２４１】
図３１〜図３３で示したように、オフセット配列を変更した場合でも、何もしないケース、及び、開始点のみ変更するケースがある。このようなケースでは書き出し処理は行われないため、オフセット配列の変更時の処理の効率がよい。
【０２４２】
尚、実施形態２におけるデータの再生時の動作は、実施形態１において図２４を参照して説明したものと同じである。
【０２４３】
図３４は、本実施形態に係る情報処理装置２００のハードウェア構成の一例を示す。情報処理装置２００は、図３４に示すように、ＣＰＵ（Central Processing Unit）２０１、メモリ２０２、記憶部２０３、読取部２０４、及び通信インターフェース２０６を含む。なお、ＣＰＵ２０１、メモリ２０２、記憶部２０３、読取部２０４、及び、通信インターフェース２０６は、例えば、バス２０７を介して互いに接続されている。情報処理装置２００は、情報処理装置４０、５０の一例である。
【０２４４】
ＣＰＵ２０１は、メモリ２０２を利用して上述のフローチャートの手順を記述したプログラムを実行する。ＣＰＵ２０１は、制御部４３、５２の機能の一部または全てを提供する。
【０２４５】
メモリ２０２は、例えば半導体メモリであり、ＲＡＭ（Random Access Memory）領域およびＲＯＭ（Read Only Memory）領域を含んで構成される。メモリ２０２は、バッファ領域４２、５７、制御変数領域４４、５３の機能の一部または全てを提供する。
【０２４６】
記憶部２０３は、例えばハードディスクである。また、記憶部２０３は、フラッシュメモリ等の半導体メモリであってもよい。また、記憶部２０３は、外部記録装置であってもよい。記憶部２０３は、ブロック区間ＤＢ４５、５４の機能の一部または全てを提供する。
【０２４７】
読取部２０４は、ＣＰＵ２０１の指示に従って着脱可能記録媒体２０５にアクセスする。着脱可能記録媒体２０５は、たとえば、半導体デバイス（ＵＳＢメモリ等）、磁気的作用により情報が入出力される媒体（磁気ディスク等）、光学的作用により情報が入出力される媒体（ＣＤ−ＲＯＭ、ＤＶＤ等）などにより実現される。尚、読取部２０４はなくてもよい。
【０２４８】
通信インターフェース２０６は、ＣＰＵ２０１の指示に従ってネットワークを介してデータを送受信する。通信インターフェース２０６は、ストリームデータ受信部４１、ブロック送信部４６、リクエスト受信部５１、リクエスト送信部５５、ブロック受信部５６、再生データ送信部５８の機能の一部または全てを提供する。また、通信インターフェース２０６は、記憶装置３００にネットワークまたはバスを介して接続される。記憶装置３００は、分散ストレージ４８、８０の機能の一部または全てを提供する。尚、記憶装置３００は、情報処理装置２００に含まれてもよい。
【０２４９】
実施形態を実現するための情報処理プログラムは、例えば、下記の形態で情報処理装置２００に提供される。
（１）記憶部２０３に予めインストールされている。
（２）着脱可能記録媒体２０５により提供される。
（３）ネットワークを介して提供される。
【０２５０】
尚情報処理装置４０と情報処理装置５０は同一の装置であってもよい。
尚、本実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
【０２５１】
上記実施形態に関し、更に以下の付記を開示する。
（付記１）
時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部と、
前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部と、
前記時系列データについての再生時刻が指定された場合、前記第１の記憶部及び前記第２の記憶部に格納された前記第１の分割データ及び第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する出力部と、
を備えることを特徴とする情報処理システム。
（付記２）
前記情報処理システムは、さらに、
前記時系列データを分割して生成した前記第１の分割データを前記第１の記憶部に格納し、前記時系列データを前記第１の分割データとは異なる時刻で分割して生成した第２の分割データを前記第２の記憶部に格納する格納処理部
を備えることを特徴とする付記１に記載の情報処理システム。
（付記３）
前記情報処理システムは、さらに、
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部
を備え、
前記格納処理部は、前記時系列データを時系列順に連続する前記領域に格納し、前記複数の領域のうち前記第１の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第１の分割データを前記第１の記憶部に格納し、前記複数の領域のうち前記第２の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第２の分割データを第２の記憶部に格納する
ことを特徴とする付記２に記載の情報処理システム。
（付記４）
前記格納処理部は、前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第１の記憶部に未格納のデータを前記第１の記憶部に格納し、前記第２の記憶部に未格納のデータを前記第２の記憶部に格納する
ことを特徴とする付記３に記載の情報処理システム。
（付記５）
前記格納処理部は、前記時系列データの重要度に応じて、前記時系列データを前記第１及び第２の分割データとは異なる時刻で分割して生成した第３の分割データを第３の記憶部に格納し、
前記出力部は、前記時系列データについての再生時刻が指定された場合、前記第１の記憶部、前記第２の記憶部、及び前記第３の記憶部に格納された前記第１の分割データ、前記第２の分割データ、及び前記第３の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする付記２〜４のうちいずれか１項に記載の情報処理システム。
（付記６）
時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部に格納された前記第１の分割データ、及び、前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部に格納された前記第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする情報処理システムの制御方法。
（付記７）
前記時系列データを分割して生成した前記第１の分割データを前記第１の記憶部に格納し、前記時系列データを前記第１の分割データとは異なる時刻で分割して生成した第２の分割データを前記第２の記憶部に格納する
ことを特徴とする付記６に記載の情報処理システムの制御方法。
（付記８）
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部の連続する前記領域に前記時系列データを時系列順に格納し、
前記複数の領域のうち前記第１の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第１の分割データを前記第１の記憶部に格納し、
前記複数の領域のうち前記第２の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第２の分割データを第２の記憶部に格納する
ことを特徴とする付記７に記載の情報処理システムの制御方法。
（付記９）
前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第１の記憶部に未格納のデータを前記第１の記憶部に格納し、前記第２の記憶部に未格納のデータを前記第２の記憶部に格納する
ことを特徴とする付記８に記載の情報処理システムの制御方法。
（付記１０）
前記時系列データの重要度に応じて、前記時系列データを前記第１及び第２の分割データとは異なる時刻で分割して生成した第３の分割データを第３の記憶部に格納し、
前記時系列データについての再生時刻が指定された場合、前記第１の記憶部、前記第２の記憶部、及び前記第３の記憶部に格納された前記第１の分割データ、前記第２の分割データ、及び前記第３の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする付記７〜９のうちいずれか１項に記載の情報処理システムの制御方法。
（付記１１）
プロセッサに、
時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第１の分割データを格納する第１の記憶部に格納された前記第１の分割データ、及び、前記時系列データが分割されたデータを示す第２の分割データであって、前記第１の分割データとは異なる時刻で分割された該第２の分割データを格納する第２の記憶部に格納された前記第２の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
処理を実行させることを特徴とする制御プログラム。
（付記１２）
プロセッサに、
前記情報処理システムは、さらに、
前記時系列データを分割して生成した前記第１の分割データを前記第１の記憶部に格納し、前記時系列データを前記第１の分割データとは異なる時刻で分割して生成した第２の分割データを前記第２の記憶部に格納する
処理を実行させることを特徴とする付記１１に記載の制御プログラム。
（付記１３）
プロセッサに、
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部の連続する前記領域に前記時系列データを時系列順に格納し、
前記複数の領域のうち前記第１の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第１の分割データを前記第１の記憶部に格納し、
前記複数の領域のうち前記第２の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第２の分割データを第２の記憶部に格納する
処理を実行させることを特徴とする付記１２に記載の制御プログラム。
（付記１４）
プロセッサに、
前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第１の記憶部に未格納のデータを前記第１の記憶部に格納し、前記第２の記憶部に未格納のデータを前記第２の記憶部に格納する
処理を実行させることを特徴とする付記１３に記載の制御プログラム。
（付記１５）
プロセッサに、
前記時系列データの重要度に応じて、前記時系列データを前記第１及び第２の分割データとは異なる時刻で分割して生成した第３の分割データを第３の記憶部に格納し、
前記時系列データについての再生時刻が指定された場合、前記第１の記憶部、前記第２の記憶部、及び前記第３の記憶部に格納された前記第１の分割データ、前記第２の分割データ、及び前記第３の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
処理を実行させることを特徴とする付記１２〜１４のうちいずれか１項に記載の制御プログラム。
【符号の説明】
【０２５２】
４０、５０    情報処理装置
４１    ストリームデータ受信部
４２、５７    バッファ領域
４３、５２    制御部
４４、５３    制御変数領域
４５、５４    ブロック区間ＤＢ
４６    ブロック送信部
５１    リクエスト受信部
５５    リクエスト送信部
５６    ブロック受信部
５８    再生データ送信部
６０    管理情報
６１    ブロック番号
６２    開始時刻
６３    終了時刻
６４    系列番号
【図１】
2014229061.tif 000003
【図２】
2014229061.tif 000004
【図３】
2014229061.tif 000005
【図４】
2014229061.tif 000006
【図６】
2014229061.tif 000007
【図７】
2014229061.tif 000008
【図８】
2014229061.tif 000009
【図９】
2014229061.tif 000010
【図１０】
2014229061.tif 000011
【図１１】
2014229061.tif 000012
【図１２】
2014229061.tif 000013
【図１３】
2014229061.tif 000014
【図１４】
2014229061.tif 000015
【図１５】
2014229061.tif 000016
【図１６】
2014229061.tif 000017
【図１７】
2014229061.tif 000018
【図１８】
2014229061.tif 000019
【図１９】
2014229061.tif 000020
【図２０】
2014229061.tif 000021
【図２１】
2014229061.tif 000022
【図２２】
2014229061.tif 000023
【図２３】
2014229061.tif 000024
【図２４】
2014229061.tif 000025
【図２５】
2014229061.tif 000026
【図２６】
2014229061.tif 000027
【図２７】
2014229061.tif 000028
【図２８】
2014229061.tif 000029
【図２９】
2014229061.tif 000030
【図３０】
2014229061.tif 000031
【図３１】
2014229061.tif 000032
【図３２】
2014229061.tif 000033
【図３３】
2014229061.tif 000034
【図３４】
2014229061.tif 000035
【図５】
2014229061.tif 000036