(実施形態1)
時系列データは、例えば、個人の生涯健康管理データ(Personal Health Record)である。個人の健康状態を個別に管理するために、医療機関・薬局・健康関連事業者・健康情報測定機器などが作り出す各種データを随時記録していく。一般的に、保存する情報は身長や体重、血液型、バイタル情報(脈拍、呼吸、血圧、体温など)、アレルギー、副作用、既往歴・症状、通院・検査・診療、処方・投薬、主治医のコメント、ケアプラン、食事情報、運動情報、検診、保険関連情報が含まれる。
このうちバイタル情報から潜在的あるいは将来的な疾患・疾病をリアルタイムに予測分析する場合には保存した長期間のデータから、分析の観点に応じて必要な範囲の時系列データに素早くアクセスする必要がある。
また、分析を並列処理で行うとき、同一データへのアクセスが競合しないように、データの複製(レプリカ)を別の場所に配置することもある。
治療履歴(投薬の履歴等)は医療ミスの検証で重要な証拠になりうるため、データの信頼性が重要である。全ての治療記録に高信頼性が必要ではなく、保存コストを考慮した場合には時々刻々ケースバイケースでデータの信頼性が変化するとみなす方がよい。
図1は、本実施形態に係るストリームの格納と再生について説明するための図である。ストリームは、頭出し性能、負荷分散、信頼性を考慮して複数のブロックに分割される。ここで、分割されたブロックは、互いに重複部分を含んでもよい。そして、分割されたブロックは分散ストレージに分散されて格納される。格納されたストリームの再生時には、再生区間で指定されたデータを含むブロックが分散ストレージから取得され、取得された複数のブロックにおいて重複部分を削除して再生区間のストリームが再構築される。
近年のストレージシステム(例えば、分散KVS(Key-Value Store)に代表されるNoSQL)は、複数のノードにデータの複製(レプリカ)が配置される。これにより、ディスク故障などによるデータ消失の確率を下げるとともに、複数のノードに配置したレプリカからデータの読み込みが可能になるため、アクセスの負荷分散が行えるようになる。このように、ブロックのレプリカを分散して配置することで高信頼性とアクセスの高速性が実現される。
図2は、ストリームデータの多重化について説明するための図である。図2に示されるように、データが多重化されるとは、同一時刻(区間)のデータが複製され、元のデータ及び複製されたデータがそれぞれ異なる記憶装置(例えばディスク)に格納されることを指す。そして、同一時刻(区間)のデータが分散して格納される異なる記憶装置の数を示す値が冗長度である。
図2においては、情報処理装置30は、ストリームを受信すると、受信したストリームを3つのブロックに複製して、それぞれのブロックを異なるディスク31a、31b、31cに格納している。図2の例では、冗長度は3である。
以下の説明では、1つのストリームを冗長化(複製)して記憶装置毎に格納されたデータを区別するために、個々の記憶装置に格納されるデータ群を1つの系列と表現する。すなわち、ある系列のデータは、その系列に対応する記憶装置に格納されたデータを指す。
複数の異なる記憶装置に格納されるデータは、ブロック単位で格納される。ブロックは、同一のストリームの時系列における特定の範囲に含まれる複数のストリームデータをまとめたものであり、再生時に読みだされるデータの最小単位である。
本実施形態では、複数の異なる記憶装置に格納されるブロックの区切り位置は、系列毎に異なる。図3は、本実施形態において、データを3重化した場合のブロックの区切り位置に関する系列間の関係を示す。
図3においては、横軸はデータの到着順(時刻)を示している。尚、ここでは、到着時刻とは、ストリームを複製する装置(図2における情報処理装置30)に到着した時刻を指すが、ストリームの個々のデータの測定または観測時刻であってもよい。また、系列1、系列2、及び系列3の3つの系列のブロックは、お互いに異なる時刻で区切られている。
系列2の区切り位置は、系列1と比較すると、系列1のブロックの区切り位置から時間軸において1/3後方にずれている。また、系列3の区切り位置は、系列1と比較すると、系列1のブロックの区切り位置から時間軸において2/3後方にずれている。
データの読み出し時には、系列1、系列2、系列3のいずれかのデータを用いることができる。そのため、図2の例のように3重化された例においては、読み込み可能な開始位置の間隔が元の1/3となるので、頭出し再生の処理に係る実行時間は、系列1のみの場合と比べて1/3で行えることになる。
また、系列1、系列2、及び系列3のデータはそれぞれ異なる記憶装置に格納されるため、1つの記憶装置に対してアクセスが集中することにより発生する処理待ちを防ぐことができる。すなわち、系列1のデータを読み出すことと並行して、系列2のデータの読み出しが行えるため、読み出し速度が向上する。さらに、データの信頼性の向上とアクセスの負荷分散が行われる。
ストリームデータにおいては、時間区間ごとにデータ重要度やアクセス頻度が異なる場合がある。そして、重要なデータやアクセス頻度が高いデータについては、通常以上に冗長度を上げて信頼性やアクセス性能を高めたい場合がある。
図4は、重要度に応じて冗長度を変更することを説明するための図である。図4の上図の棒グラフでは、横軸は時刻を示し、縦軸は重要度またはアクセス頻度を示す。図4の下図は、図4の上図の棒グラフで示す重要度またはアクセス頻度に応じたストリームデータの冗長度を示す。図4では、最も重要度(またはアクセス頻度)が高い時刻に対応するストリームデータの冗長度が4になっている。このように、重要度(またはアクセス頻度)が高いデータに対しては、冗長度を高くする。
このようにデータの重要度やアクセス頻度に応じて冗長度を変更するために、本実施形態では、ブロックの重複区間を追加または削除することにより冗長度を変更する。このとき、ブロックの大きさを固定しなければ、過剰な冗長化を減らすことができる。
図5は、本実施形態において、過剰な冗長化を減らすことができることを説明するための図である。尚、以下の説明ではデータの重要度に適した冗長度を期待冗長度と記す。
図5(A)は、ブロックの大きさを固定することで過剰な冗長化が生じている例である。冗長化させる区間が1ブロックで十分な区間であっても(期待冗長度が1の部分)、冗長度が2となっているので、過剰な冗長化が生じている。
図5(B)は、ブロック長を変更することにより、過剰な冗長化を減らした例である。図5(B)では、期待冗長度1のデータを含む系列1のブロックのサイズが縮小されることにより、過剰な冗長化を防いでいる。
尚、ストリームデータの重要度は、種々の方法を用いて決定される。例えば、時系列データの特性に応じて、日中に取得したデータは重要度を高くし、夜間に取得したデータは重要度を低くする等の方法が考えられる。また、ストリームデータの重要度には、ストリームデータのアクセス頻度を用いてもよい。
また、例えば、図2に示した三重化に加えて、重要度の高いデータの箇所のみさらに、高い冗長度にすることもできる。この場合、全データについて少なくとも冗長度を3に保つことを保証しつつ、さらに高い多重度を実現できる。
図6は、本実施形態における情報処理システムの機能ブロック図を示す。情報処理システム1は、第1の記憶部2、第2の記憶部3、出力部4、格納処理部5、循環格納部6、及び第3の記憶部7を含む。
第1の記憶部2は、時系列データが分割されたデータを示す第1の分割データを格納する。
第2の記憶部3は、時系列データが分割されたデータを示す第2の分割データであって、第1の分割データとは異なる時刻で分割された第2の分割データを格納する。
出力部4は、時系列データについての再生時刻が指定された場合、第1の記憶部2及び第2の記憶部3に格納された第1の分割データ及び第2の分割データのうち、再生時刻前であって再生時刻に直近する時刻で分割された分割データを読み出して、出力する。また、出力部4は、時系列データについての再生時刻が指定された場合、第1の記憶部2、第2の記憶部3、及び第3の記憶部7に格納された第1の分割データ、第2の分割データ、及び第3の分割データのうち、再生時刻前であって再生時刻に直近する時刻で分割された分割データを読み出して、出力する。
格納処理部5は、時系列データを分割して生成した第1の分割データを第1の記憶部2に格納し、時系列データを第1の分割データとは異なる時刻で分割して生成した第2の分割データを第2の記憶部3に格納する。また、格納処理部5は、時系列データを時系列順に、連続する循環格納部6の領域に格納し、複数の循環格納部6の領域のうち第1の記憶部2に対応付けられた領域に時系列データを格納した場合、循環格納部6の複数の領域に格納されているデータを複製して生成した第1の分割データを第1の記憶部2に格納し、循環格納部6の複数の領域のうち第2の記憶部3に対応付けられた領域に時系列データを格納した場合、循環格納部6の複数の領域に格納されているデータを複製して生成した第2の分割データを第2の記憶部3に格納する。また、格納処理部5は、循環格納部6の領域に時系列データの終端を示すデータを格納した場合、循環格納部6の複数の領域に格納されているデータのうち、第1の記憶部2に未格納のデータを第1の記憶部2に格納し、第2の記憶部3に未格納のデータを第2の記憶部3に格納する。また、格納処理部5は、時系列データの重要度に応じて、時系列データを第1及び第2の分割データとは異なる時刻で分割して生成した第3の分割データを第3の記憶部7に格納する。
循環格納部6は、情報を格納する複数の領域であって、論理的に循環する形式で配置された複数の領域を含む。
第3の記憶部7は、時系列データを第1及び第2の分割データとは異なる時刻で分割して生成した第3の分割データを格納する。
図7及び図8は、本実施形態における情報処理システムの構成を示す。図7は、記憶装置へのストリームデータの書き出し処理に関する情報処理システムの構成を示す。
情報処理装置40は、ストリームデータを受信し、受信したストリームデータを複製して、複数の記憶装置47a、47bを含む分散ストレージ48に書き出す処理を行う。書き出しの単位は、複数のストリームデータを含むブロック単位である。この書き出し処理を実現するために、情報処理装置40は、ストリームデータ受信部41、バッファ領域42、制御部43、制御変数領域44、ブロック区間データベース(以下、データベースを「DB」という)45、及びブロック送信部46を含む。
記憶装置47a、47bは、第1の記憶部2、第2の記憶部3、第3の記憶部7の一例である。ストリームデータ受信部41、制御部43、ブロック送信部46は、格納処理部4の一例である。バッファ領域42は、循環格納部5の一例である。
ストリームデータ受信部41は、ストリームデータを受信し、受信したストリームデータをバッファ領域42に格納する。
バッファ領域42は、複数のストリームデータをブロックとしてまとめるために使用される作業領域である。
制御部43は、バッファ領域42に格納された個々のストリームデータをまとめることによりブロックを生成し、ブロック送信部46を介して記憶装置47a、47bに対して送信する。ここで、バッファ領域42に格納されたストリームデータは複製されて、複数の異なる記憶装置47a、47bに送信される。すなわち、ストリームデータは冗長化される。以下の説明では、制御部43がストリームデータを記憶装置47a、47bに対して送信することを書き出し処理と記す場合がある。
制御変数領域44は、制御部43の書き出し処理により使用される制御変数情報が格納される領域である。
ブロック区間DB45は、制御部43が生成したブロックに関する管理情報が格納される。管理情報には、ブロックに含まれる複数のストリームデータのうち、時系列において最初のストリームデータの(取得)時刻と最後のストリームデータの(取得)時刻の情報が含まれる。ここで、以下の説明では、ブロックに含まれる最初のストリームデータの時刻をブロックの開始時刻と記し、最後のストリームデータの時刻をブロックの終了時刻と記す場合がある。また、管理情報には、ブロックがどの記憶装置47a、47bに格納されるかを示す情報、すなわち、どの系列の情報かを示す情報が格納される。
ブロック送信部46は、制御部43により生成されたブロックを記憶装置47a、47bに対して送信する。
記憶装置47a、47bは、情報処理装置40に接続され、受信したブロックを記憶する。以下の説明では、記憶装置47a、47bを特に区別しない場合には、単に記憶装置47と記す。記憶装置47は情報処理装置40にNAS(Network Attached Storage)やSAN(Storage Area Network)等のネットワークを介して接続されてもよいし、PCI(Peripheral Component Interconnect)Express等のバスを介して接続されてもよい。また、記憶装置47は、情報処理装置40に含まれてもよい。尚、図7の例では、冗長度が2の場合として記憶装置が2つに冗長化された例を記したが、分散ストレージ48に含まれる記憶装置47は、データの多重度に応じて、さらに冗長化されてもよい。
次に、記憶装置からのストリームデータの読み込み処理について説明する。図8は、ストリームデータの記憶装置からの読み込み処理に関する情報処理システムの構成を示す。
情報処理装置50は、ストリームデータの再生要求を受信し、受信した再生要求の読み込み対象範囲のストリームデータを含むブロックを分散ストレージ80に含まれる記憶装置59a、59bから取得する。そして、情報処理装置50は、取得したブロックから読み込み対象範囲のストリームデータを生成して、生成したストリームデータを再生要求元に送信する。この読み込み処理を実現するために、情報処理装置50は、リクエスト受信部51、制御部52、制御変数領域53、ブロック区間DB54、リクエスト送信部55、ブロック受信部56、バッファ領域57、再生データ送信部58を含む。
記憶装置59a、59bは、第1の記憶部2、第2の記憶部3、第3の記憶部7の一例である。制御部52は、出力部4の一例である。
リクエスト受信部51は、ストリームデータの再生要求を情報処理装置50に接続された端末から受信し、受信した再生要求を制御部52に転送する。再生要求には、再生要求範囲として開始時刻と終了時刻が指定されており、この開始時刻と終了時刻の間のストリームデータが読み出し対象のストリームデータとなる。
制御部52は、再生要求を受信すると、再生要求範囲のストリームデータが含まれるブロックをブロック区間DB54から検索する。そして、制御部52は、リクエスト送信部55を介して、検索したブロックの取得要求を記憶装置59a、59bに送信する。ブロックの取得要求を受けた記憶装置59a、59bから、要求したブロックがバッファ領域57に格納されたら、制御部52は、各ブロックの重複部分を除去し、または複数のブロックを連結し、再生範囲のストリームである再生ストリームを生成する。そして、制御部52は、再生データ送信部58を介して、生成した再生ストリームを再生要求の送信元の端末に送信する。
制御変数領域53は、制御部52の読み込み処理により使用される制御変数情報が格納される領域である。
ブロック区間DB54は、図7のブロック区間DB45と同じである。
リクエスト送信部55は、制御部52からのブロックの取得要求を分散ストレージ80に送信する。
ブロック受信部56は、ブロック取得リクエストを受けた分散ストレージ80から送信されたブロックを受信する。そして、ブロック受信部56は、受信したブロックをバッファ領域57に格納する。
バッファ領域57は、ブロックの取得要求を受けた記憶装置59a、59bからブロック受信部56を介してブロックが格納される領域であって、制御部52により、再生ストリームの生成に使用される領域である。
再生データ送信部58は、制御部52により生成された再生ストリームを再生要求元に送信する。
尚、分散ストレージ80は、図7において説明した分散ストレージ48に対応しており、記憶装置59a、59bは、図7において、ブロックが格納された記憶装置47a、47bに対応する。すなわち、記憶装置59a、59bには、記憶装置47a、47bに格納されたのと同様にブロックが格納されているものである。以下の説明では、記憶装置59a、59bを特に区別しない場合には、単に記憶装置59と記す。
次に、ブロック区間DB45、54に格納されるブロックの管理情報について説明する。図9は管理情報の構成の一例を示す。
管理情報60は、ブロック番号61、開始時刻62、終了時刻63、系列番号64のデータ項目を含む。
ブロック番号61は、記憶装置47に格納されるブロックを一意に識別するためのブロック番号である。開始時刻62は、ブロック番号61のブロックの開始時刻を示す情報である。終了時刻63は、ブロック番号61のブロックの終了時刻を示す情報である。系列番号64は、ブロック番号61で示されるブロックの系列を示す情報である。系列番号64は、言い換えるとブロックが格納される記憶装置を識別するための情報ともいえる。
次に、データの冗長化処理について詳細に説明する。ストリームデータを冗長化して記憶装置47に格納するための仕組みの1つとして、本実施形態では循環バッファが用いられる。尚、循環バッファ(リングバッファ)は、バッファ領域42、57の一例である。
ストリームデータ受信部41は、ストリームデータを受信すると、受信したデータを循環バッファに格納する。そして、図3を参照して説明したように、制御部43は循環バッファに格納されたデータを系列間でブロックの区切り位置をずらして、冗長化された個々の記憶装置47に書き出す。
循環バッファは、個々のストリームデータを格納することができる領域(要素)を複数含み、その領域(要素)は循環バッファ内で一意に振られたインデックス(添え字)により区別される。本実施形態においては、インデックスは、各領域(要素)に一意に対応付けられた0から昇順に振られた整数とする。循環バッファにおいてインデックスが対応付けられた各領域の数(要素数)を、以下の説明ではバッファサイズと記す。
循環バッファでは、データが格納される領域はインデックスを指定することにより特定されるが、インデックスを指定するために与えられる値は、バッファサイズより大きい値でもよい。インデックスを指定するために与えられる値がバッファサイズより大きい場合は、指定されたインデックスをバッファサイズで割ったときの余りの値のインデックスが指定される。よって、循環バッファは直線状のバッファの両端を論理的に繋げたバッファといえる。
本実施形態において1つのブロックにN個のストリームデータが含まれるとすると、循環バッファは、N(N:整数)個のストリームデータを格納可能である。以下では、バッファサイズをNとする。循環バッファに格納される個々のデータは、受信した順にバッファのインデックスの昇順に格納される。そして、循環バッファの最後のインデックス(本実施形態ではN-1)の領域にデータが格納されると、次に受信されたデータは最初のインデックス(本実施形態では0)の領域に格納される。循環バッファの個々の領域(要素)のサイズは固定としてもよいし、格納されるデータのサイズに応じて可変としてもよい。すなわち、循環バッファに格納される個々のデータのサイズはそれぞれ異なってもよい。
制御部43は、ストリームデータが循環バッファの領域のうちの所定のインデックスの領域に格納された場合、及び、循環バッファに格納されたデータがストリームの終端データである場合に、循環バッファ内のデータを記憶装置47に書き出す処理を行う。
先ず、ストリームデータが循環バッファの領域のうちの所定のインデックスの領域に格納された場合に、循環バッファ内のデータを記憶装置47に書き出す処理について説明する。
ストリームデータの書き出し処理のトリガとなるインデックスは、冗長化された個々の記憶装置47、すなわち系列にそれぞれ対応付けられており、循環バッファに等間隔で配置される。
図10は、本実施形態におけるデータの冗長化において、データが三重化されて保存される場合の例を説明するための図である。
データが三重化されて格納される場合において、個々の記憶装置47に格納されるデータ群を1つの系列とすると、循環バッファのインデックスが(N/3-1)、(2N/3-1)、N-1の位置にデータが格納された場合に、それぞれの系列のデータの書き出し処理が行われる。この各系列に対応した、書き出し処理が行われる際のインデックスの位置を、以下の説明では、オフセット位置と記す場合がある。オフセット位置は、循環バッファにおいて等間隔で配置することにより、系列間のブロックの区切り位置が等間隔でずれることになる。
1つのブロックに格納されるデータの数がN、冗長度がK(K:整数)である場合において、循環バッファのインデックスが0からN-1までとすると、オフセット位置は、(N*x/K-1)(x=1,2,…,K)となる。図10の例の場合、冗長度K=3であるので、オフセット位置は、(N/3-1)、(2N/3-1)、N-1となる。
データが三重化される場合には3つの系列が存在することとなるが、ここでは説明のために、それぞれの系列を系列1、系列2、系列3とする。すると、制御部43は、循環バッファのインデックスが(N/3-1)である領域にデータが格納された場合、循環バッファに格納されているデータを1つのブロックとして、系列1に対応する記憶装置47に格納する。また、制御部43は、循環バッファのインデックスが(2N/3-1)である領域にデータが格納された場合、循環バッファに格納されているデータを1つのブロックとして、系列2に対応する記憶装置47に格納する。そして、制御部43は、循環バッファのインデックスがN-1である領域にデータが格納された場合、循環バッファに格納されているデータを1つのブロックとして、系列3に対応する記憶装置47に格納する。尚、制御部43がバッファ内のデータを各系列に対応する記憶装置47に格納するタイミングではバッファの内容は失われず、そのまま保持される。
また、制御部43は、循環バッファに格納されたデータがストリームの終端データである場合に、循環バッファ内のデータを記憶装置47に書き出す。
ストリームデータには、ストリームの終端を表す終端データがある。図11は、ストリーム終端を説明するための図である。ストリームは論理的に区切られたデータの列であるが、ストリームの末尾には、ストリーム終端という特別な区切りがある。このようなストリームの特別な区切りを示すデータが終端データである。終端データは、例えば、区切りを表す特殊な属性を持ってもよいし、特定のサイズとすることにより、区切りを表すことを示してもよい。
次に、制御部43による循環バッファからの記憶装置47に対するデータの書き出し処理の動作について説明する。
制御部43による書き出し処理は、書き出しのタイミングと、書き出し処理時のバッファの状態により、3つのパターンがある。この3つのパターンを書き出し処理1、書き出し処理2、書き出し処理3として説明する。
制御部43によるブロックの書き出しタイミングは、受信したストリームデータが循環バッファのオフセット位置に格納された時点、及び、制御部43によりストリームデータの終端が検知された時点である。
書き出し処理時の循環バッファの状態としては、循環バッファのすべての領域(要素)にデータが格納されている状態と、循環バッファの一部の領域(要素)にデータが格納されている状態がある。循環バッファの一部の領域(要素)にデータが格納されている状態は、循環バッファに何もデータが格納されていない状態から、一度目に循環バッファの最後のインデックスの領域にデータが格納されるまでの状態を示す。すなわち、データが格納される循環バッファのインデックスが1周完了前である場合である。一度最後のインデックスの領域にデータが格納されると、それ以降は、すべての領域(要素)にデータが格納されている状態となる。
書き出し処理1は、書き出しのタイミングに関わらず、書き出し処理時の循環バッファの状態が一部の領域(要素)にデータが格納されている状態である場合に実行される。書き出し処理1では、制御部43は、最初のインデックス(本実施形態では0)から、最後にデータを格納したインデックスまでのデータを1つのブロックとして生成し、生成したブロックを記憶装置47に格納する。すなわち、データがオフセット位置に格納された場合に書き出しが行われる場合は、制御部43は、先ず、最初のインデックスからオフセット位置までの領域に格納されているデータを1つのブロックとして生成する。そして制御部43は、生成したブロックをオフセット位置に対応付けられた記憶装置47に格納する。終端データを検知した場合には、制御部43は、最初のインデックスから終端データを格納したインデックスまでの領域に格納されているデータを記憶装置47に格納する。尚、制御部43により生成されるブロックには、ストリームデータは循環バッファに格納された順に先頭から配置される。
書き出し処理2は、受信したストリームデータが循環バッファのオフセット位置に格納された時点で、循環バッファのすべての領域(要素)にデータが格納されている状態である場合に実行される。書き出し処理2では、制御部43は、書き出し対象系列のオフセット位置の次のインデックスからインデックスの昇順に循環バッファ内のデータを1つのブロック(説明のためにブロックAとする)に追加していく。そして、循環バッファの最後のインデックスに到達したら、最初のインデックスに戻り、最初のインデックスからオフセット位置までのデータをインデックスの昇順に、ブロックAに追加する。そして、制御部43は、生成したブロック(ブロックA)を記憶装置47に書き出す。
書き出し処理3は、制御部43が終端データを検知した時点で、そのデータが格納されたインデックスが書き出し対象系列のオフセット位置より小さい場合に実行される。もしくは、書き出し処理3は、制御部43が終端データを検知した時点で、そのデータが格納されたインデックスが書き出し対象系列のオフセット位置より大きい、且つ、既に一度循環バッファの全ての要素にデータが格納されている場合に実行される。
書き出し処理3では、制御部43は、書き出し対象系列のオフセット位置の次のインデックスからインデックスの昇順に循環バッファ内のデータを1つのブロック(説明のためにブロックBとする)に追加していく。そして、循環バッファの最後のインデックスに到達したら、最初のインデックスに戻り、最初のインデックスから格納位置までのデータをインデックスの昇順に、最後のインデックスまでに到達するまでにデータを追加していたブロック(ブロックB)に追加する。そして、制御部43は、生成したブロック(ブロックB)を記憶装置47に書き出す。
図12は、ブロックの生成と記憶装置47への書き出し処理の動作フローを示す。
図12においては、循環バッファのバッファサイズをN、循環バッファをbuffer[]、冗長度をK、系列毎のオフセット位置に1加えた値が格納された配列(以下、オフセット配列と記す場合がある)をpos[]とする。さらに、ストリームデータ受信部41による循環バッファへのデータの格納位置のインデックスを示す変数をwp、循環バッファのすべてのインデックスに少なくとも一度情報が格納されたか否かを示す変数をfirst_cycとする。
buffer[]は、循環バッファを要素数Nの配列で表したものであり、buffer[]の添字は、上述した循環バッファのインデックスに対応する。配列buffer[]の各要素には受信したストリームデータが格納される。尚、以下の説明では、単に「インデックス」と記す場合には、循環バッファのインデックス、すなわち、buffer[]の添字のことを指し、その他の配列の添字を記す場合には、明示的に配列名を指定して「添字」と記す。尚、配列buffer[]の各要素は格納されるデータに応じて可変長であってよい。
wpは、ストリームデータ受信部41がデータを循環バッファに格納する際の格納位置のインデックスを示す変数である。すなわち、ストリームデータ受信部41は循環バッファのwpの値のインデックスに受信したストリームデータを格納する。以下の説明においては、ストリームデータ受信部41がデータを循環バッファに格納する際の格納位置を単に格納位置wpと記す場合がある。
配列pos[]は、系列毎のオフセット位置に1を加えた値が格納された配列である。pos[0]には系列1のオフセット位置に1を加えた値が格納され、pos[1]、pos[2]、・・・、pos[K-1]には、それぞれ、系列2、系列3、・・・、系列Kのオフセット位置に1を加えた値が格納される。例えば、x=1,2,…,K-1とすると、pos[x-1]=(N*x/K)、pos[K-1]=0となる。
first_cycは、循環バッファのすべてのインデックスに少なくとも一度ストリームデータが格納されたか否かを示す変数であり、すなわち、制御部43が循環バッファにストリームデータを格納する処理が1周目か否かを示す変数である。first_cycの値がtrueである場合は、制御部43が循環バッファにストリームデータを格納する処理が1周目であることを示す。以下の説明においては、first_cycは、1周目フラグfirst_cycと記す場合がある。
変数の初期化処理として、制御部43は、wpに0を代入し、first_cycにtrueを代入する。また、制御部43は、pos[]のそれぞれの要素には、各系列のオフセット位置に1を加えた値を格納する。
変数の初期化処理の後、制御部43は、ストリームデータを受信する毎に、S301〜S310の処理を実行する。S301〜S310の1回のループは、ストリームデータ受信部41が1つのストリームデータを受信する毎に実行される処理であり、循環バッファの1つの領域(要素)にストリームデータが格納される処理である。また、1回のループが完了する毎に、循環バッファのストリームデータが格納されるインデックスは1つずつ進む。そして、循環バッファの最終インデックスにデータが格納されるループが終了すると、次のループでは、最初のインデックスにデータが格納されるループに戻る。
制御部43は、ストリームデータを受信すると、buffer[wp]に受信したデータを格納する(S301)。ここで、上述したように、wpはストリームデータが格納される循環バッファのインデックスを示す変数である。次に、制御部43はwpの値をインクリメントする(S302)。
S302において、wpの値をインクリメントした結果、wpの値がN(バッファサイズ)になった場合は、制御部43はwpに0を代入する。この処理は、循環バッファの最初のインデックスからストリームデータが格納されていき、最後のインデックスにデータが格納されたら、最初のインデックスに戻ってデータが格納されるときの、格納位置が最初のインデックスに戻る動作を示している。
次に、制御部43はwpの値が0か否かを判定する(S303)。wpの値が0である場合は(S303でYes)、循環バッファのすべてのインデックスにデータが一度以上格納されたことになるので、制御部43はfirst_cycの値をfalseにする(S304)。そして処理はS305〜S310で示されるオフセット位置チェック処理に遷移する。また、S303においてwpの値が0でない場合(S303でNo)、処理はS305〜S310で示されるオフセット位置チェック処理に遷移する。
処理S305〜S310のループで示されるオフセット位置チェックは、1回のループが各系列に対する処理を示しており、すべての系列に対して処理が繰り返される。すなわち、S305〜S310の処理(ループ)は、系列を示す変数iが0からK-1の間繰り返し行われ、各ループの最後にはiの値がインクリメントされる。
先ず制御部43は、iの値が0以上でかつK-1以下であるか否かを判定する(S305)。iの値が0以上でかつK-1以下である場合、制御部43はS306〜S309の処理を実行する。また、iの値がK-1より大きい場合、ループは終了し、処理が終了する。
S306において、制御部43は、pos[i]の値がwpと等しいか否かを判定する。ここで、pos[i]は、上述したように、系列iのオフセット位置に1を加えた値であり、wpは、S301で循環バッファに受信データを格納したときの格納位置を示す値がS302でインクリメントされた結果の値である。すなわち、S306では、S301における循環バッファの格納位置が、系列iのオフセット位置か否かの判定が行われる。
S306において、pos[i]の値がwpと異なると判定された場合(S306でNo)、処理はS310に遷移する。S306においてpos[i]の値がwpと等しいと判定した場合(S306でYes)、制御部43は、first_cycの値がtrueかfalseかを判定する(S307)。first_cycの値がtrueである場合(S307でYes)、処理は書き出し処理1に遷移する(S308)。S307においてfirst_cycの値がfalseである場合(S307でNo)、処理は書き出し処理2に遷移する(S309)。
次に、書き出し処理1について詳しく説明する。書き出し処理1では、上述したように、最初に受信したストリームデータが循環バッファに格納されてから、一度目に循環バッファの最後のインデックスにデータが格納されるまでに実行される書き出し処理である。
図13は、書き出し処理1を説明するための図である。図13(A)は、循環バッファの要素のうち、一度もデータが格納されていない要素が存在する場合であって、循環バッファのオフセット位置に、ストリームデータが書き込まれた場合に実行されるときの書き出し処理1の例である。図13(B)は、循環バッファの要素のうち、一度もデータが格納されていない要素が存在する場合であって、ストリームデータの終端が検知された時点で実行されるときの書き出し処理1の例である。図13(A)では、循環バッファのインデックス「0」からpos[i]-1のデータがまとめられブロックが生成される。図13(A)では、ブロックのサイズはpos[i]となる。図13(B)では、循環バッファのインデックス「0」からwp-1のデータがまとめられ、ブロックが生成される。図13(B)では、ブロックのサイズはwpとなる。
図14は、書き出し処理1の動作フローを示す。制御部43は、循環バッファのインデックス「0」から格納位置(wp-1)までのデータをまとめて1つのブロックを生成する処理をS402〜S404のループ処理で行う。
制御部43は、先ず、書き出し対象のブロックにブロック番号を割り当てる(S401)。S401において、書き出し対象のブロックにはストリームデータは含まれていない。尚、ブロック番号は、各ブロックを一意に識別するための識別情報である。
S402〜S404の処理ループは、S401において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
先ず、制御部43は、循環バッファに格納されたストリームデータのうち、書き出し対象ブロックに含めるデータのインデックスを指定するための変数jに0を代入する(S402)。そして、制御部43は、buffer[j]に格納されたデータをS401で割り当てられたブロックに含める(S403)。そして、制御部43はjの値をインクリメントし、jの値が0以上でかつwp-1以下であるか否かを判定する(S402)。jの値が0以上でかつwp-1である場合、処理がループし、再びS403が実行される。
S402において、jの値が0未満またはwp以上である場合、ループは終了し、処理はS405に遷移する。
S405において、制御部43は、S401〜S404において生成された書き出し対象ブロックを系列iに対応する記憶装置47に書き出す。
そして、制御部43は、書き出したブロックの情報をブロック区間DB45の管理情報60に格納する(S406)。すなわち、制御部43は、管理情報60の新たなレコードを作成し、作成したレコードのブロック番号61、開始時刻62、終了時刻63、系列番号64に、S405において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
次に、書き出し処理2について詳しく説明する。書き出し処理2では、上述したように、循環バッファの全てのインデックスに一度以上データが格納された後に、循環バッファのオフセット位置に、ストリームデータ受信部41が受信したストリームデータが書き込まれた場合に実行される書き出し処理の例である。
図15は、書き出し処理2を説明するための図である。書き出し処理2では、制御部43は、循環バッファのインデックスがpos[i]からN-1までのデータをインデックスの昇順にまとめ、さらに、インデックスがNに達した場合、Nに0を代入して、pos[i]-1までのデータを昇順にまとめて、ブロックの生成処理を行う。尚、ブロックのサイズはNとなる。
図16は書き出し処理2の動作フローを示す。制御部43は、S502〜S504のループ処理において、循環バッファのデータをまとめて1つのブロックを生成する処理を行う。
制御部43は、先ず、書き出し対象のブロックにブロック番号を割り当てる(S501)。S501において、書き出し対象のブロックにはストリームデータは含まれていない。
S502〜S504の処理ループは、S501において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。ここで、ブロックに循環バッファ内のストリームデータを含ませる処理は、時間の早いストリームデータから順に実行される。よって、ストリームデータは時間の早い順に、ブロックの先頭から配置される。
制御部43は、先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する(S502)。そして、制御部43は、buffer[(wp+j)%N]に格納されたデータをS501で割り当てられたブロックに含める(S503)。ここで、(wp+j)%Nは、(wp+j)をNで割った余りである。そして、制御部43はjの値をインクリメントし、jの値が0以上でかつN-1以下であるか否かを判定する(S502)。jの値が0以上でかつN-1以下である場合、処理がループし、再びS503が実行される。S502において、jの値が0未満またはN以上である場合、ループは終了し、処理はS505に遷移する。
S505において、制御部43は、S501〜S504において生成された書き出し対象ブロックを系列iに対応する記憶装置47に書き出す。
そして、制御部43は、書き出したブロックの情報をブロック区間DB45の管理情報60に格納する(S506)。すなわち、制御部43は、管理情報60の新たなレコードを作成し、作成したレコードのブロック番号61、開始時刻62、終了時刻63、系列番号64に、S505において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
次に、制御部43がストリームデータの終端データを検出した場合の動作について説明する。制御部43はストリームデータが終端データであると検出すると、終端データを循環バッファに格納した時点で循環バッファに格納されているデータのうち、各系列の記憶装置47に未だ格納されていないデータを、各系列に対応する記憶装置47に格納する。
図17は、制御部43がストリームデータの終端データを検出した場合の動作フロー図を示す。
S601〜S607の処理は、すべての系列に対して繰り返し行われる。すなわち、S601〜S607の処理(ループ)は、系列を示す変数iが0からK-1の間繰り返し行われ、変数iは、各ループの最後(S607)においてインクリメントされる。
先ず制御部43は、循環バッファにおいて、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値よりも大きいか否かを判定する。具体的には、制御部43はpos[i]の値がwpの値よりも大きいか否かを判定する(S602)。ここで、wpの値は終端データが格納されたインデックスに1加えた値とする。pos[i]の値がwpの値よりも大きい場合(S602でYes)、制御部43は、first_cycの値がtrueかfalseかを判定する(S603)。
S603において、first_cycの値がtrueである場合(S603でYes)、制御部43は、書き出し処理1を実行する(S604)。この書き出し処理1は、図14を参照して説明した書き出し処理1(S401〜S406)である。書き出し処理1の後、処理はS607に遷移する。
S603において、first_cycの値がfalseである場合(S603でNo)、制御部43は、書き出し処理3を実行する(S606)。書き出し処理3の後、処理はS607に遷移する。
S602において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値以下の場合、制御部43は、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいか否かを判定する。言い換えると、S602においてpos[i]の値がwpの値以下の場合(S602でNo)、制御部43は、pos[i]の値がwpの値よりも小さいか否かを判定する(S605)。
S605において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいと判定した場合、制御部43は、書き出し処理3を実行する。すなわち、S605においてpos[i]の値がwpの値よりも小さいと判定した場合(S605でYes)、制御部43は、書き出し処理3を実行する(S606)。書き出し処理3が完了すると、処理はS607に遷移する。
S605において、系列iのオフセット位置のインデックスの値が終端データの格納位置のインデックスの値以上であると判定された場合、すなわち、pos[i]の値がwpの値以上であると判定された場合(S605でNo)、処理はS607に遷移する。
図18は、書き出し処理3を説明するための図である。書き出し処理3では、制御部43は、循環バッファのインデックスがpos[i]からN-1までのデータをインデックスの昇順にまとめ、さらに、インデックスがNに達した場合、インデックスが0からwp-1まで昇順にまとめて、ブロックの生成処理を行う。尚、ブロックのサイズは(N-pos[i]+wp)%Nとなる。
図19は、書き出し処理3の動作フローを示す。制御部43は、循環バッファのデータをまとめて1つのブロックを生成する処理を、S802〜S804のループ処理で行う。
制御部43は、先ず、書き出し対象のブロックにブロック番号を割り当てる(S801)。S801において、書き出し対象のブロックにはストリームデータは含まれていない。
S802〜S804の処理ループは、S801において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
制御部43は、先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する(S802)。そして、制御部43は、buffer[(pos[i]+j)%N]に格納されたデータをS801で割り当てられたブロックに含める(S803)。そして、制御部43はjの値をインクリメントし、jの値が0以上でかつwp+N-pos[i]-1以下であるか否かを判定する(S802)。jの値が0以上でかつwp+N-pos[i]-1以下である場合、処理がループし、再びS803が実行される。S802において、jの値が0未満またはwp+N-pos[i]以上である場合、ループは終了し、処理はS805に遷移する。
S805において、制御部43は、S801〜S804において生成された書き出し対象ブロックを系列iに対応する記憶装置47に書き出す。
そして、制御部43は、書き出したブロックの情報をブロック区間DB45の管理情報60に格納する(S806)。すなわち、制御部43は、管理情報60の新たなレコードを作成し、作成したレコードのブロック番号61、開始時刻62、終了時刻63、系列番号64に、S805において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
次に、冗長度を変化させる動作について説明する。
冗長度の変更は、制御部43による書き込み処理が終了してから次のストリームデータを受信するまでのタイミングで行われる。すなわち、図12のS305〜S310のループ処理が終了してから、次にS301の処理が実行されるまでの間、又は、図17のS601〜S607のループ処理が終了してから、次に図12のS301の処理が実行されるまでの間に実行される。冗長度の変更の影響は、変更処理が行われた後に受信したストリームデータに及ぶ。
冗長度の変更は、冗長度の増加処理と、冗長度の減少処理に分けられる。
先ず、冗長度の増加処理について説明する。図20は、冗長度の増加処理の動作フローを示す。
図20においては、冗長度Kがd(dは0より大きい整数)増加したときの、更新後の冗長度をK’とする。先ず制御部43は、更新後の冗長度K’の値を初期化する。すなわち、制御部43は、K’にK+dの値を代入する(S901)。そして、制御部43はオフセット配列のKからK’-1までの要素を初期化する。すなわち、制御部43は、pos[K]〜pos[K’-1]までの値にwpを代入する(S902〜S904)。
次に、冗長度変更後の各系列のオフセット位置を、循環バッファにおいて等間隔で再配置するために使用される作業配列pos2[]を定義する。作業配列pos2[]の定義に先立ち、pos2[]を定義するために使用される変数eを定義し、eにN/K’を代入する(S905)。
pos2[]は、要素数がK’の配列であり、各要素には添字に対応する系列のオフセット位置の情報が格納される。ここでオフセット位置は循環バッファにおいて等間隔に配置される。すなわち、系列を示す変数iが0以上でK’-1以下の間、pos2[i]=i*eの処理が繰り返し行われる。各ループの最後にiの値がインクリメントされる(S906〜S908)。
次に、冗長度変更前までに循環バッファ内に格納されたデータを記憶装置47に書き出す処理が行われる(S909)。具体的には、制御部43がストリーム終端を検出した場合と同じ処理が行われる。すなわち、図17のS601〜S607の処理が実行される。
次に、制御部43は、オフセット配列pos[]にS906〜S908で定義した作業配列pos2[]をコピーする(S910)。すなわち、制御部43は、pos[0]にpos2[0]の値を代入し、pos[1]にpos2[1]の値を代入し、・・・のように、pos[]の各要素に、添字が対応するpos2[]の各要素の値を代入する。尚、pos2[]に対応するpos[]の要素がない場合は、pos[]の要素が新たに作成され、pos2[]の値が代入される。例えば、pos[K’-1]にはpos2[K’-1]の値が代入されることとなる。よって代入後のpos[]の要素数は、K’となる。
そして、制御部43は、循環バッファの格納位置を示す変数wpの値に0を代入する(S911)。これは、循環バッファの冗長度変更処理後は、再び循環バッファのインデックスが0の位置から受信したストリームデータが格納されていくことを示している。
尚、S901〜908とS909は順序が前後してもよいし、S911は、S901〜S910のいずれかの前または後で実行されればよい。
次に、冗長度の減少処理について説明する。図21は、冗長度の減少処理の動作フローを示す。
図21においては、冗長度Kが1減少した場合の動作フローを示す。冗長度Kがd減少した場合は、図21の動作フローをd回繰り返す。
先ず、制御部43は、各系列(0〜K-1)のうち、循環バッファに最も多くの未書き込みデータが格納されている系列iを決定する(S1001)。ここで、未書き込みデータは、循環バッファに格納されているデータのうち、記憶装置47に対して一度も書き出し処理が行われていないデータを指す。各系列間で、未書き込みデータが最も多いとは、未書き込みデータが格納されている領域のインデックスの合計数が最も多い系列を指す。
次に、制御部43は、系列iに対して、ストリーム終端を受信した場合の処理を実行する(S1002)。すなわち、図17のS601〜S607の処理が実行される。
次に、制御部43は、オフセット配列pos[]の位置iを詰める(削除する)(S1003)。例えば、pos[i]にpos[i+1]の値を代入し、pos[i+1]にpos[i+2]の値を代入し、・・・、pos[K-2]にpos[K-1]の値を代入し、pos[K-1]の値を削除する処理が行われる。
S1001〜S1003の処理により、更新後の冗長度K’はK-1となる。さらに、S1001〜S1003をd回繰り返すことにより、冗長度をd減少させることができる。
尚、S1003の後に、図20のS905〜S911で示した処理を行い、オフセット配列を循環バッファにおいて均等に配置するようにしてもよい。
ストリームの時間区間ごとのデータの重要度に応じて、図20または図21で示した冗長度の変更処理を行うことにより過剰な冗長化を防ぐことができるが、データの重要度はストリームデータの実時間入力後に確定するものが多い。そこで、制御部43は既に一度記憶装置47に格納済のブロックに対して、重要度に応じた冗長度に変更する再冗長化処理を行う。再冗長化処理は、記憶装置47に格納されたブロックを読み出し、再生処理時の頭出し性能やメモリ使用量を最適化するようにブロックのサイズの変更や冗長度の変更が行われる。
次に、再冗長化処理の動作について詳しく説明する。図22は、再冗長化処理の動作フローを示す。
先ず、制御部43は、再冗長化対象の区間を決定する(S1101)。ここで、区間とは、ストリームデータの時系列で連続な所定の範囲を指す。再冗長化対象の区間の決定は、例えばストリームデータの重要度に基づいて行われる。例えば、制御部43は、ストリームデータの各時刻における重要度を取得し、重要度が一定の値である範囲に基づいて再冗長化を行う区間を決定する。具体的には、重要度がA、B、Cの3段階で表される場合、制御部43は重要度がA(一定)である連続する区間を再冗長化対象の区間として決定してもよい。また、例えば、頭出し再生の開始時点となりえない区間を再冗長化対象の区間としてもよい。
再冗長化対象の区間が決定され、再冗長化対象の区間の開始時刻と終了時刻が決まると、制御部43は、その区間に存在するデータを含む複数のブロックをブロック区間DB45で検索する(S1102)。
図23は、再冗長化対象の区間に存在するデータを含む複数のブロックの例を示す。図23において、再冗長化開始位置から再冗長化終了位置までに存在するデータを含むブロックは、{a、b、c、d、e、f、g}である。
次に、制御部43は、再冗長化を行うブロックの組み合わせを決定する(S1103)。具体的には、制御部43は、頭出しを用いた読み出し性能やメモリ使用量の評価関数に基づいて、最適または近似解でブロック組合せを導出する。図23の例の場合、開始位置から終了位置までのデータを読み出す場合には、{a、b、c}のブロック読み出し以外にも、{d、e、f}、{d、f、g}、等のブロックの組み合わせがある。制御部43は、これらの組み合わせのうち、組合せ最適化の種々の技術を用いて最適な組み合わせを導出する。例えば、再冗長化対象区間においてできるだけデータに重複がなく、時間の幅を満たす組み合わせを導出するようにしてもよい。
次に、制御部43は、S1103で決定した組み合わせのブロックを循環バッファに読み出す(S1104)。尚、ブロックの読み出しは、循環バッファでなく、所定の記憶領域でもよい。
そして、制御部43は、S1104で読み出した複数のブロックにおいて、ブロックの重複部分を削除し、または、複数のブロックを連結することにより、新しいブロックを生成して、生成したブロックを記憶装置47に格納する(S1105)。
既に記憶装置47に格納されたブロックを読みだして、再冗長化開始位置から開始終了までのストリームを生成し、生成したストリームに対して、図20及び図21を参照して説明した冗長度の変更処理を適用してもよい。これにより、再冗長化開始位置から開始終了までのデータを、ストリームデータを記憶装置47に格納した後で決定した冗長度に変更することができる。
また、以下のように再冗長化処理を行うこともできる。すなわち、先ず、情報処理装置は、既に記憶装置47に格納されたブロックを読み出して、再冗長化開始位置から開始終了までのストリームを生成する。そして、情報処理装置は、生成したストリームに対して、前回格納時と異なるブロックサイズNを用いて、図12〜図19を参照して説明したのと同様のブロックの書き出し処理を行う。このようにすることで、再冗長化開始位置から開始終了までのデータを、ストリームデータを記憶装置47に格納した後で決定したブロックサイズに変更することができる。
図24は、データの再生時の動作フローを示す。
先ず、リクエスト受信部51は再生要求を受信する(S1201)。再生要求には、再生要求対象の再生開始時刻と再生終了時刻が含まれる。
次に、制御部52は、受信した再生要求に含まれる再生開始時刻を、再生要求対象のストリームデータを含むブロックを取得するために使用される作業用変数である指定時刻に指定する(S1202)。
次に、制御部52は、記憶装置59に格納された複数のブロックのうち、開始時刻が、指定時刻より以前の時刻であり且つ最も指定時刻に近いブロックを、ブロック区間DB54から検索する(S1203)。具体的には、制御部52は、ブロック区間DB54に記憶される管理情報60の開始時刻62を参照し、指定時刻より以前の時刻であり、且つ最も指定時刻に近いレコードを検索する。
次に、制御部52は、リクエスト送信部55を介して、記憶装置59にブロックの読み込み要求を送信し、ブロックを取得する(S1204)。具体的には、制御部52は、S1203で検索したレコードの系列番号64の系列に対応する記憶装置59に対して、ブロック番号61のブロックの取得要求を行う。ブロックの取得要求を受信した記憶装置59は、ブロック番号で指定されたブロックを情報処理装置50に送信する。情報処理装置50は、ブロック受信部56を介して記憶装置59から取得要求したブロックを受信する。
次に、制御部52は、再生区間を覆うのに十分な長さのブロックが全て得られたか否かを判定する(S1205)。すなわち、制御部52は、S1204で取得したブロックのうちのいずれかの終了時刻が、再生要求に含まれる再生終了時刻よりも後であれば、再生区間を覆うのに十分な長さのブロックが全て得られたと判定する。
S1205において、再生区間を覆うのに十分な長さのブロックが全て得られていないと判定した場合(S1205でNo)、制御部52はS1204において取得した複数のブロックの終了時刻のうち、最も遅い終了時刻を新たに指定時刻に指定する(S1206)。そして、処理はS1203に遷移する。
S1205において、再生区間を覆うのに十分な長さのブロックが全て得られたと判定した場合(S1205でYes)、制御部52は、S1204で取得した複数のブロックにおいて、時刻が重複しているストリームデータを削除し、再生ストリームを生成する。そして、制御部52は、再生ストリームを再生処理の要求元の端末に対して送信する(S1207)。そして、処理は終了する。
(実施形態2)
実施形態1は、冗長度の変更処理において、オフセット位置が変更される前に循環バッファの中身が全てブロックとして掃出され(S909)、その後の処理は、循環バッファの格納位置wpは0から開始される。そのため、冗長度の変更処理の直前または直後に書き出されるブロックのサイズは、冗長度の変更処理がない場合に比べて小さくなる。
そこで、実施形態2では、冗長度の変更処理において、現在の格納位置wp、系列i毎の未書き出しデータ量、更新前オフセット、更新後オフセットを考慮し、循環バッファの内容を全て書き出さないようにしてオフセット位置を更新する。これにより、冗長度変更時の書き出し処理を削減し、サイズが小さなブロックが格納される頻度を減少させる。
実施形態2では、循環バッファの開始点とfirst_cycの値を系列毎に管理する。図25は、実施形態2に係る書き出し処理の制御変数である、系列番号71、区切り位置72、1周目フラグ73、開始点74の関係を示す情報の一例である。
系列番号71は、各系列を一意に識別するための情報である。区切り位置72は、系列番号71に対応する系列のオフセット位置の情報である。1周目フラグは、系列番号71に対応する系列の1周目フラグの情報である。1周目フラグは実施形態1で説明したものと同様である。ただし、実施形態2では、系列毎に開始位置が異なるため、1周目フラグの値も系列毎に異なる。開始点74は、系列番号71に対応する系列の循環バッファにおける開始位置を示す情報である。開始点74は、配列start[]の値で示され、系列iの開始位置をstart[i]として表す。実施形態1では、開始位置は全ての系列でインデックス0であった。すなわち、start[i]はブロックiに拠らず常に0であった。実施形態2においては、系列毎にstart[i]の値が異なる場合がある。
実施形態2に係る書き出し処理、読み込み処理に関する情報処理装置の構成は、実施形態1において、図7及び図8を参照して説明したものと同様である。
図26は、実施形態2に係る、ブロックの生成と記憶装置への書き出し処理の動作フローを示す。
図26においては、循環バッファのバッファサイズをN、循環バッファをbuffer[]、冗長度をK、系列毎のオフセット位置に1加えた値が格納された配列をpos[]とする。さらに、ストリームデータ受信部41による循環バッファへのデータの格納位置のインデックスを示す変数をwpとする。また、循環バッファのすべてのインデックスに少なくとも一度情報が格納されたか否かを示す変数が格納された配列を1周目フラグ配列first_cyc[K]とする。
循環バッファbuffer[]、オフセット配列pos[]、格納位置wpは、実施形態1で説明したものと同じであるため、説明は省略する。
1周目フラグ配列first_cyc[]は、系列毎の1周目フラグが各要素に格納された配列である。
変数の初期化処理として、制御部43は、格納位置wpに0を代入し、1周目フラグ配列first_cyc[]の全ての要素にtrueを代入する。また、制御部43は、オフセット配列pos[]のそれぞれの要素に各系列のオフセット位置に1加えた値を格納する。
変数の初期化処理の後、制御部43は、ストリームデータを受信する毎に、S1301〜S1310の処理を実行する。S1301〜S1310の1回のループは、ストリームデータ受信部41が1つのストリームデータを受信する毎に実行される処理であり、循環バッファの1つのインデックスにストリームデータが格納される処理である。また、1回のループが完了する毎に、循環バッファにおける格納位置wpは1つずつ進む。そして、循環バッファの最終インデックスにデータが格納される処理ループが終了すると、次のループでは、最初のインデックスにデータが格納されるループに戻る。
制御部43は、ストリームデータを受信すると、buffer[wp]に受信したデータを格納する(S1301)。ここで、上述したように、wpはストリームデータが格納される循環バッファのインデックスを示す変数である。次に、制御部43はwpの値をインクリメントする(S1302)。
S1302において、格納位置wpの値をインクリメントした結果、wpの値がN(バッファサイズ)になった場合は、制御部43はwpに0を代入する。この処理は、循環バッファの最初のインデックスからストリームデータが格納されていき、最後のインデックスにデータが格納されたら、最初のインデックスに戻ってデータが格納されるときの、格納位置が最初のインデックスに戻る動作を示している。
次に、制御部43は、すべての系列に対して、S1303〜S1310の書き出し処理を繰り返す。すなわち、S1303〜S1310の処理(ループ)は、系列を示す変数iが0からK-1の間繰り返し行われ、各ループの最後にはiの値がインクリメントされる。
書き出し処理のループにおいて、先ず制御部43は、wpの値がstart[i]と等しいか否かを判定する(S1304)。wpの値とstart[i]の値が等しい場合は(S1304でYes)、start[i]を開始位置としたときに循環バッファのすべてのインデックスにデータが一度以上格納されたことになるので、制御部43はfirst_cyc[i]の値をfalseにする(S1305)。そして処理はS1306に遷移する。また、S1304においてwpの値がstart[i]と等しくない場合(S1304でNo)、処理はS1306に遷移する。
次に、制御部43は、pos[i]の値がwpと等しいか否かを判定する(S1306)。ここで、pos[i]は、上述したように、系列iのオフセット位置に1を加えた値であり、wpは、S1301で循環バッファに受信データを格納したときの格納位置を示す値がS1302でインクリメントされた結果の値である。すなわち、S1306では、S1301における循環バッファの格納位置が系列iのオフセット位置か否かの判定が行われる。
S1306において、pos[i]の値がwpと異なると判定された場合(S1306でNo)、処理はS1310に遷移する。S1306においてpos[i]の値がwpと等しいと判定した場合(S1306でYes)、制御部43は、first_cyc[i]の値がtrueかfalseかを判定する(S1307)。first_cyc[i]の値がtrueである場合(S1307でYes)、処理は書き出し処理4に遷移する(S1308)。S1307においてfirst_cyc[i]の値がfalseである場合(S1307でNo)、処理は書き出し処理5に遷移する(S1309)。
次に、書き出し処理4について説明する。書き出し処理4では、ストリームデータがstart[i]に一度目に格納されてから、一度目に循環バッファの最後のインデックスにデータが格納されるまでに実行される書き出し処理である。
図27は、書き出し処理4の動作フローを示す。制御部43は、循環バッファのインデックスstart[i]から(wp+N-start[i]+1)%Nまでのデータをまとめて1つのブロックを生成する処理をS1402〜S1404のループ処理において行う。
制御部43は、先ず、書き出し対象のブロックにブロック番号を割り当てる(S1401)。S1401において、書き出し対象のブロックにはストリームデータは含まれていない。
S1402〜S1404の処理ループは、S1401においてブロック番号を割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
ここで、ブロックに循環バッファ内のストリームデータを含ませる処理は、時間の早いストリームデータから順に実行される。よって、ストリームデータが時間の早い順にブロックの先頭から配置される。
先ず、制御部43は、バッファに格納されたストリームデータのうち、書き出し対象ブロックに含めるデータのインデックスを指定するための変数jに0を代入する(S1402)。そして、制御部43は、buffer[(start[i]+j)%N]に格納されたデータをS1401で割り当てられたブロックに含める(S1403)。そして、制御部43はjの値をインクリメントし、jの値が0以上でかつ(wp+N-start[i]+1)%N以下であるか否かを判定する(S1402)。jの値が0以上でかつ(wp+N-start[i]+1)%N以下である場合、処理がループし、再びS1403が実行される。
S1402において、jの値が0未満または(wp+N-start[i]+1)%N+1以上である場合、ループは終了し、処理はS1405に遷移する。
S1405において、制御部43は、S1401〜S1404において生成された書き出し対象ブロックを系列iに対応する記憶装置47にブロック送信部46を介して書き出す処理を行う。
そして、制御部43は、書き出したブロックの情報をブロック区間DB45の管理情報60に格納する(S1406)。すなわち制御部43は、管理情報60の新たなレコードを作成し、作成したレコードのブロック番号61、開始時刻62、終了時刻63、系列番号64に、S1405において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
次に、書き出し処理5について説明する。書き出し処理5では、循環バッファの全てのインデックスに一度以上データが格納された後に、循環バッファのオフセット位置にストリームデータ受信部41が受信したストリームデータが書き込まれた場合に実行される書き出し処理の例である。
図28は書き出し処理5の動作フローを示す。制御部43は、S1502〜S1504のループ処理において、循環バッファのデータをまとめて1つのブロックを生成する処理を行う。
制御部43は、先ず、書き出し対象のブロックにブロック番号を割り当てる(S1501)。S1501において、書き出し対象のブロックにはストリームデータは含まれていない。
S1502〜S1504の処理ループは、S1501において割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
ループにおいて、制御部43は先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する(S1502)。そして、制御部43は、buffer[(wp+j)%N]に格納されたデータをS1501で割り当てられたブロックに含める(S1503)。そして、制御部43はjの値をインクリメントし、jの値が0以上でかつN-1以下であるか否かを判定する(S1502)。jの値が0以上でかつN-1以下である場合、処理がループし、再びS1503が実行される。S1502において、jの値が0未満またはN以上である場合、ループは終了し、処理はS1505に遷移する。
S1505において、制御部43は、S1501〜S1504において生成された書き出し対象ブロックを系列iに対応する記憶装置47にブロック送信部46を介して書き出す処理を行う。
そして、制御部43は、書き出したブロックの情報をブロック区間DB45の管理情報60に格納する(S1506)。すなわち、制御部43は管理情報60の新たなレコードを作成し、作成したレコードのブロック番号61、開始時刻62、終了時刻63、系列番号64に、S1505において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
次に、制御部43がストリームデータの終端データを検出した場合の動作について説明する。制御部43はストリームデータが終端データであると検出すると、終端データを循環バッファに格納した時点で循環バッファに格納されているデータのうち、各系列の記憶装置47に未だ格納されていないデータを格納する処理を行う。
図29は、制御部43がストリームデータの終端データを検出した場合の動作フロー図を示す。
S1601〜S1607の処理は、すべての系列に対して繰り返し行われる。すなわち、S1601〜S1607の処理(ループ)は、系列を示す変数iが0からK-1の間繰り返し行われ、変数iは、各ループの最後(S1607)においてインクリメントされる。
先ず制御部43は、循環バッファにおいて、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値よりも大きいか否かを判定する。具体的には、制御部43はpos[i]の値がwpの値よりも大きいか否かを判定する(S1602)。ここで、wpの値は終端データが格納されたインデックスに1加えた値とする。pos[i]の値がwpの値よりも大きい場合(S1602でYes)、制御部43は、first_cyc[i]の値がtrueかfalseかを判定する(S1603)。
S1603において、first_cyc[i]の値がtrueである場合(S1603でYes)、制御部43は、書き出し処理4を実行する(S1604)。この書き出し処理4は、図27を参照して説明した書き出し処理4(S1401〜S1406)である。書き出し処理4の後、処理はS1607に遷移する。
S1603において、first_cyc[i]の値がfalseである場合(S1603でNo)、制御部43は、書き出し処理6を実行する(S1606)。書き出し処理6の後、処理はS1607に遷移する。
S1602において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値以下の場合、制御部43は、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいか否かを判定する。言い換えると、S602においてpos[i]の値がwpの値以下の場合(S1602でNo)、制御部43は、pos[i]の値がwpの値よりも小さいか否かを判定する(S1605)。
S1605において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値より小さいと判定した場合、制御部43は、書き出し処理6を実行する。すなわち、S1605においてpos[i]の値がwpの値よりも小さいと判定した場合(S1605でYes)、制御部43は、書き出し処理6を実行する(S1606)。書き出し処理6が完了すると、処理はS1607に遷移する。
S1605において、系列iのオフセット位置のインデックスの値が、終端データの格納位置のインデックスの値以上であると判定された場合、すなわち、pos[i]の値がwpの値以上であると判定された場合(S1605でNo)、処理はS1607に遷移する。
次に、書き出し処理6の動作について説明する。書き出し処理6は、循環バッファに格納したデータが終端データであると制御部43が判定した時点で、系列iの開始位置にデータが格納されてから既に全ての要素にデータが格納された後である場合に実行される書き出し処理である。言い換えると、書き出し処理6は、循環バッファに格納したデータが終端データであると制御部43が判定した時点で、系列iの開始位置にデータが格納されてから循環バッファの格納位置wpが循環バッファを1周した後である場合に実行される書き出し処理である。
図30は、書き出し処理6の動作フローを示す。制御部43は、S1702〜S1704のループ処理において循環バッファのデータをまとめて1つのブロックを生成する。
制御部43は、先ず、書き出し対象のブロックにブロック番号を割り当てる(S1701)。S1701においては、書き出し対象のブロックにはストリームデータは含まれていない状態である。
S1702〜S1704の処理ループは、S1701においてブロック番号を割り当てたブロックに循環バッファ内のストリームデータを含ませる処理を示している。
制御部43は、先ず、書き出し処理を行うバッファのインデックスを指定するための変数jに0を代入する(S1702)。そして、制御部43は、buffer[(pos[i]+j)%N]に格納されているデータをS1701で割り当てられたブロックに含める(S1703)。そして、制御部43はS1704に処理を進める。すなわち、処理はS1702に戻る。すると、制御部43はjの値をインクリメントし、jの値が0以上でかつwp+N-pos[i]-1以下であるか否かを判定する(S1702)。jの値が0以上でかつwp+N-pos[i]-1以下である場合、再びS1703が実行される。S1702において、jの値が0未満またはwp+N-pos[i]以上である場合、ループは終了し、制御部43はS1705に処理を進める。
S1705において、制御部43は、S1701〜S1704において生成された書き出し対象ブロックを系列iに対応する記憶装置47にブロック送信部46を介して書き出す処理を行う。
そして、制御部43は、書き出したブロックの情報をブロック区間DB45の管理情報60に格納する(S1706)。すなわち、制御部43は、管理情報60の新たなレコードを作成し、作成したレコードのブロック番号61、開始時刻62、終了時刻63、系列番号64に、S1705において書き出したブロックのブロック番号、開始時刻、終了時刻、系列iの情報をそれぞれ格納する。
次に、冗長度を変化させる動作について説明する。ここでは、系列iのオフセット配列の値がpos[i]からpos’[i]に変更される場合を説明する。図31は、実施形態2に係るオフセット位置変更時の動作フローを示す。
先ず、制御部43は、pos[i]がwpより大きいか否かを判定する(S1801)。pos[i]がwpより大きいと判定した場合(S1801でYes)、制御部43は、first_cyc[i]の値がtrueかfalseかを判定する(S1802)。first_cyc[i]の値がtrueである場合(S1802でYes)、処理は変更処理1に遷移する(S1803)。変更処理1については、図32を参照して後ほど説明する。
S1802において、first_cyc[i]の値がfalseであると判定された場合(S1802でNo)、処理はS1805に遷移する。
S1801において、pos[i]がwp以下であると判定した場合(S1801でNo)、制御部43は、pos[i]がwpより小さいか否かを判定する(S1804)。pos[i]がwp以上であると判定された場合(S1804でNo)、処理は終了する。
S1804において、pos[i]がwpより小さいと判定された場合(S1804でYes)、処理はS1805に遷移する。
S1805では、制御部43は、循環バッファにおいて、pos[i]、pos’[i]、wpが時計回りにこの順で並ぶか否かを判定する(S1805)。ここで、時計回りとは、図10で示した循環バッファにおける時計回りのように、循環バッファのインデックスの値が増加する方向を指す。尚、インデックスの値が0を挟んでいても、順序関係は保持されるものとする。例えば、「pos[i]、pos’[i]、wpが時計回りにこの順で並ぶ」には、pos[i]とpos’[i]の間にインデックス0の領域が存在する場合も含まれる。循環バッファにおいて、時計回りにpos[i]、pos’[i]、wpの順で並ぶと判定した場合(S1805でYes)、制御部43は、pos[i]からpos’[i]までのデータの書き出し処理を行う(S1806)。そして、処理は終了する。
S1805において、時計回りにpos[i]、pos’[i]、wpの順で並んでいないと判定した場合(S1805でNo)、制御部43は、循環バッファにおいて、時計まわりにpos[i]、wp、pos’[i]の順序に並ぶか否かを判定する(S1807)。時計まわりにpos[i]、wp、pos’[i]の順序に並ぶと判定した場合(S1807でYes)、制御部43は、first_cyc[i]にtrueを設定し、start[i]にpos[i]の値を設定する(S1808)。そして、処理は終了する。
S1807において、時計まわりにpos[i]、wp、pos’[i]の順序に並んでいないと判定された場合(S1807でNo)、処理は終了する。
次に、S1803で実行される変更処理1について説明する。図32は、実施形態2に係る変更処理1の動作フローを示す。
制御部43は、循環バッファにおいて、時計まわりに、pos[i]、pos’[i]、wpの順序に並ぶか否かを判定する(S1901)。制御部43が、時計まわりに、pos[i]、pos’[i]、wpの順序に並んでいないと判定した場合(S1901でNo)、処理は変更処理2に遷移する(S1902)。変更処理2については、図33を参照して後ほど説明する。
S1901において、時計まわりに、pos[i]、pos’[i]、wpの順序に並ぶと判定した場合(S1901でYes)、制御部43は、循環バッファにおいて、時計まわりに、start[i]、pos[i]、pos’[i]、wpの順に並ぶか否かを判定する(S1903)。そして時計まわりに、start[i]、pos[i]、pos’[i]、wpの順に並ぶと判定した場合(S1903でYes)、制御部43は、pos[i]からpos’[i]までのデータの書き出し処理を行う(S1904)。そして処理は終了する。
S1903において、時計まわりに、start[i]、pos[i]、pos’[i]、wpの順に並ばないと判定した場合(S1903でNo)、制御部43は、循環バッファにおいて、時計まわりに、pos[i]、start[i]、pos’[i]、wpの順に並ぶか否かを判定する(S1905)。時計まわりに、pos[i]、start[i]、pos’[i]、wpの順に並ぶと判定した場合(S1905でYes)、制御部43は、start[i]からpos’[i]までのデータの書き出し処理を行う(S1906)。そして処理は終了する。
S1905において、時計まわりに、pos[i]、start[i]、pos’[i]、wpの順に並ばないと判定した場合(S1905でNo)、制御部43は、循環バッファにおいて、時計まわりに、pos[i]、pos’[i]、wp、start[i]の順に並ぶか否かを判定する(S1907)。時計まわりに、pos[i]、pos’[i]、wp、start[i]の順に並ぶと判定した場合(S1907でYes)、制御部43は、pos[i]からpos’[i]までのデータの書き出し処理を行う(S1908)。そして処理は終了する。
S1907において、時計まわりに、pos[i]、pos’[i]、wp、start[i]の順に並ばないと判定された場合(S1907でNo)、処理は終了する。
次に、S1902で実行される変更処理2について説明する。図33は、実施形態2に係る変更処理2の動作フローを示す。
制御部43は、循環バッファにおいて、pos[i]、wp、pos’[i]が時計まわりにこの順序に並ぶか否かを判定する(S2001)。制御部43が、時計まわりに、pos[i]、wp、pos’[i]の順序に並んでいないと判定した場合(S2001でNo)、処理は終了する。
S2001において、時計まわりに、pos[i]、wp、pos’[i]の順序に並ぶと判定した場合(S2001でYes)、制御部43は、循環バッファにおいて、時計まわりに、start[i]、pos[i]、wp、pos’[i]の順に並ぶか否かを判定する(S2002)。時計まわりに、start[i]、pos[i]、wp、pos’[i]の順に並ぶと判定した場合(S2002でYes)、制御部43は、start[i]の値にpos[i]の値を設定する(S2003)。そして処理は終了する。
S2002において、時計まわりに、start[i]、pos[i]、wp、pos’[i]の順に並ばないと判定した場合(S2002でNo)、制御部43は、循環バッファにおいて、時計まわりに、pos[i]、wp、start[i]、pos’[i]の順に並ぶか否かを判定する(S2004)。時計まわりに、pos[i]、wp、start[i]、pos’[i]の順に並ぶと判定した場合(S2004でYes)、制御部43は、start[i]にpos[i]の値を設定する(S2003)。そして処理は終了する。
S2004において、時計まわりに、pos[i]、wp、start[i]、pos’[i]の順に並ばないと判定した場合(S2004でNo)、制御部43は、循環バッファにおいて、時計まわりに、pos[i]、wp、pos’[i]、start[i]の順に並ぶか否かを判定する(S2006)。時計まわりに、pos[i]、wp、pos’[i]、start[i]の順に並ぶと判定した場合(S2006でYes)、制御部43は、start[i]の値にpos[i]の値を設定する(S2003)。そして処理は終了する。
S2006において、時計まわりに、pos[i]、wp、pos’[i]、start[i]の順に並ばないと判定した場合(S2006でNo)、処理は終了する。
尚、冗長度が増加した場合、追加した系列に対応する変更前のオフセット位置は存在しないが、追加した系列の開始位置と1周目フラグの値は初期状態とする。すなわち、追加した系列をiとすると、start[i]にwpが設定され、first_cyc[i]にtrueが設定された状態となる。
また、冗長度が減少した場合、削除した系列の変更後のオフセット位置は存在しなくなるが、削除した系列に対しては、ストリーム終端を受信した場合の書き出し処理を行う。すなわち、削除した系列をiとすると、pos[i]に対して図29のS1601〜S1607の処理が行われる。
尚、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]の順となる場合も何も処理は行われない。
図31〜図33で示したように、オフセット配列を変更した場合でも、何もしないケース、及び、開始点のみ変更するケースがある。このようなケースでは書き出し処理は行われないため、オフセット配列の変更時の処理の効率がよい。
尚、実施形態2におけるデータの再生時の動作は、実施形態1において図24を参照して説明したものと同じである。
図34は、本実施形態に係る情報処理装置200のハードウェア構成の一例を示す。情報処理装置200は、図34に示すように、CPU(Central Processing Unit)201、メモリ202、記憶部203、読取部204、及び通信インターフェース206を含む。なお、CPU201、メモリ202、記憶部203、読取部204、及び、通信インターフェース206は、例えば、バス207を介して互いに接続されている。情報処理装置200は、情報処理装置40、50の一例である。
CPU201は、メモリ202を利用して上述のフローチャートの手順を記述したプログラムを実行する。CPU201は、制御部43、52の機能の一部または全てを提供する。
メモリ202は、例えば半導体メモリであり、RAM(Random Access Memory)領域およびROM(Read Only Memory)領域を含んで構成される。メモリ202は、バッファ領域42、57、制御変数領域44、53の機能の一部または全てを提供する。
記憶部203は、例えばハードディスクである。また、記憶部203は、フラッシュメモリ等の半導体メモリであってもよい。また、記憶部203は、外部記録装置であってもよい。記憶部203は、ブロック区間DB45、54の機能の一部または全てを提供する。
読取部204は、CPU201の指示に従って着脱可能記録媒体205にアクセスする。着脱可能記録媒体205は、たとえば、半導体デバイス(USBメモリ等)、磁気的作用により情報が入出力される媒体(磁気ディスク等)、光学的作用により情報が入出力される媒体(CD−ROM、DVD等)などにより実現される。尚、読取部204はなくてもよい。
通信インターフェース206は、CPU201の指示に従ってネットワークを介してデータを送受信する。通信インターフェース206は、ストリームデータ受信部41、ブロック送信部46、リクエスト受信部51、リクエスト送信部55、ブロック受信部56、再生データ送信部58の機能の一部または全てを提供する。また、通信インターフェース206は、記憶装置300にネットワークまたはバスを介して接続される。記憶装置300は、分散ストレージ48、80の機能の一部または全てを提供する。尚、記憶装置300は、情報処理装置200に含まれてもよい。
実施形態を実現するための情報処理プログラムは、例えば、下記の形態で情報処理装置200に提供される。
(1)記憶部203に予めインストールされている。
(2)着脱可能記録媒体205により提供される。
(3)ネットワークを介して提供される。
尚情報処理装置40と情報処理装置50は同一の装置であってもよい。
尚、本実施形態は、以上に述べた実施の形態に限定されるものではなく、本実施形態の要旨を逸脱しない範囲内で種々の構成または実施形態を取ることができる。
上記実施形態に関し、更に以下の付記を開示する。
(付記1)
時系列データが分割されたデータを示す第1の分割データを格納する第1の記憶部と、
前記時系列データが分割されたデータを示す第2の分割データであって、前記第1の分割データとは異なる時刻で分割された該第2の分割データを格納する第2の記憶部と、
前記時系列データについての再生時刻が指定された場合、前記第1の記憶部及び前記第2の記憶部に格納された前記第1の分割データ及び第2の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する出力部と、
を備えることを特徴とする情報処理システム。
(付記2)
前記情報処理システムは、さらに、
前記時系列データを分割して生成した前記第1の分割データを前記第1の記憶部に格納し、前記時系列データを前記第1の分割データとは異なる時刻で分割して生成した第2の分割データを前記第2の記憶部に格納する格納処理部
を備えることを特徴とする付記1に記載の情報処理システム。
(付記3)
前記情報処理システムは、さらに、
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部
を備え、
前記格納処理部は、前記時系列データを時系列順に連続する前記領域に格納し、前記複数の領域のうち前記第1の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第1の分割データを前記第1の記憶部に格納し、前記複数の領域のうち前記第2の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第2の分割データを第2の記憶部に格納する
ことを特徴とする付記2に記載の情報処理システム。
(付記4)
前記格納処理部は、前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第1の記憶部に未格納のデータを前記第1の記憶部に格納し、前記第2の記憶部に未格納のデータを前記第2の記憶部に格納する
ことを特徴とする付記3に記載の情報処理システム。
(付記5)
前記格納処理部は、前記時系列データの重要度に応じて、前記時系列データを前記第1及び第2の分割データとは異なる時刻で分割して生成した第3の分割データを第3の記憶部に格納し、
前記出力部は、前記時系列データについての再生時刻が指定された場合、前記第1の記憶部、前記第2の記憶部、及び前記第3の記憶部に格納された前記第1の分割データ、前記第2の分割データ、及び前記第3の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする付記2〜4のうちいずれか1項に記載の情報処理システム。
(付記6)
時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第1の分割データを格納する第1の記憶部に格納された前記第1の分割データ、及び、前記時系列データが分割されたデータを示す第2の分割データであって、前記第1の分割データとは異なる時刻で分割された該第2の分割データを格納する第2の記憶部に格納された前記第2の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする情報処理システムの制御方法。
(付記7)
前記時系列データを分割して生成した前記第1の分割データを前記第1の記憶部に格納し、前記時系列データを前記第1の分割データとは異なる時刻で分割して生成した第2の分割データを前記第2の記憶部に格納する
ことを特徴とする付記6に記載の情報処理システムの制御方法。
(付記8)
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部の連続する前記領域に前記時系列データを時系列順に格納し、
前記複数の領域のうち前記第1の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第1の分割データを前記第1の記憶部に格納し、
前記複数の領域のうち前記第2の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第2の分割データを第2の記憶部に格納する
ことを特徴とする付記7に記載の情報処理システムの制御方法。
(付記9)
前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第1の記憶部に未格納のデータを前記第1の記憶部に格納し、前記第2の記憶部に未格納のデータを前記第2の記憶部に格納する
ことを特徴とする付記8に記載の情報処理システムの制御方法。
(付記10)
前記時系列データの重要度に応じて、前記時系列データを前記第1及び第2の分割データとは異なる時刻で分割して生成した第3の分割データを第3の記憶部に格納し、
前記時系列データについての再生時刻が指定された場合、前記第1の記憶部、前記第2の記憶部、及び前記第3の記憶部に格納された前記第1の分割データ、前記第2の分割データ、及び前記第3の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
ことを特徴とする付記7〜9のうちいずれか1項に記載の情報処理システムの制御方法。
(付記11)
プロセッサに、
時系列データについての再生時刻が指定された場合、前記時系列データが分割されたデータを示す第1の分割データを格納する第1の記憶部に格納された前記第1の分割データ、及び、前記時系列データが分割されたデータを示す第2の分割データであって、前記第1の分割データとは異なる時刻で分割された該第2の分割データを格納する第2の記憶部に格納された前記第2の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
処理を実行させることを特徴とする制御プログラム。
(付記12)
プロセッサに、
前記情報処理システムは、さらに、
前記時系列データを分割して生成した前記第1の分割データを前記第1の記憶部に格納し、前記時系列データを前記第1の分割データとは異なる時刻で分割して生成した第2の分割データを前記第2の記憶部に格納する
処理を実行させることを特徴とする付記11に記載の制御プログラム。
(付記13)
プロセッサに、
情報を格納する複数の領域であって、論理的に循環する形式で配置された該複数の領域を含む循環格納部の連続する前記領域に前記時系列データを時系列順に格納し、
前記複数の領域のうち前記第1の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第1の分割データを前記第1の記憶部に格納し、
前記複数の領域のうち前記第2の記憶部に対応付けられた領域に前記時系列データを格納した場合、前記複数の領域に格納されているデータを複製して生成した前記第2の分割データを第2の記憶部に格納する
処理を実行させることを特徴とする付記12に記載の制御プログラム。
(付記14)
プロセッサに、
前記領域に時系列データの終端を示すデータを格納した場合、前記複数の領域に格納されているデータのうち、前記第1の記憶部に未格納のデータを前記第1の記憶部に格納し、前記第2の記憶部に未格納のデータを前記第2の記憶部に格納する
処理を実行させることを特徴とする付記13に記載の制御プログラム。
(付記15)
プロセッサに、
前記時系列データの重要度に応じて、前記時系列データを前記第1及び第2の分割データとは異なる時刻で分割して生成した第3の分割データを第3の記憶部に格納し、
前記時系列データについての再生時刻が指定された場合、前記第1の記憶部、前記第2の記憶部、及び前記第3の記憶部に格納された前記第1の分割データ、前記第2の分割データ、及び前記第3の分割データのうち、前記再生時刻前であって該再生時刻に直近する時刻で分割された分割データを読み出して、出力する
処理を実行させることを特徴とする付記12〜14のうちいずれか1項に記載の制御プログラム。