(57)【特許請求の範囲】
【請求項１】
特定の項目でソートした複数のデータを記憶するデータ記憶部と、
前記データ記憶部に記憶されるデータが予め定めたグループ数に分割されるグループごとに、当該グループ内の先頭に位置するデータを特定する先頭情報と当該グループ内の末尾に位置するデータを特定する末尾情報とを記憶する情報記憶部と、
前記データ記憶部にデータを格納する場合に、当該データが有する前記特定の項目に基づいて特定される位置に格納する格納制御部と、
前記格納制御部によって前記データが前記データ記憶部に格納された場合に、前記各グループに属するデータ数の差が１つ以下となるように、前記情報記憶部に記憶される前記グループごとの先頭情報と末尾情報とを更新する更新部と
を有することを特徴とするデータ分割装置。
【請求項２】
前記更新部は、前記格納制御部によってデータが格納されたグループに属するデータ数と他のグループに属するデータ数との差分が所定値を超える場合に、前記データが格納されたグループについて、前記データが格納されたグループの先頭情報と末尾情報との間に位置するデータ数が１つ減るように、前記先頭情報または末尾情報を更新することを特徴とする請求項１に記載のデータ分割装置。
【請求項３】
前記更新部は、前記格納制御部によってデータが格納されたグループに属するデータ数との差分が前記所定値を超える他のグループについて、当該他のグループの先頭情報と末尾情報との間に位置するデータ数が１つ増えるように、前記先頭情報または末尾情報を更新することを特徴とする請求項２に記載のデータ分割装置。
【請求項４】
前記更新部は、前記格納制御部によってデータが格納されたグループに属するデータ数との差分が前記所定値を超える他のグループと、前記格納されたグループとの間に位置する各グループについて、前記先頭情報と末尾情報との間に位置するデータ数を変えることなく、当該各グループの先頭情報および末尾情報を前記格納したグループの方向に１つずつスライドさせたデータを特定する情報に更新することを特徴とする請求項３に記載のデータ分割装置。
【請求項５】
前記データ記憶部に記憶されるデータが分割されるグループのうち、ユーザに指定されたグループの先頭情報と末尾情報とを前記情報記憶部から読み出し、読み出した先頭情報に該当するデータから末尾情報に該当するデータまでのデータを前記データ記憶部から読み出して、所定の装置に出力する出力部をさらに有することを特徴とする請求項１から４のいずれか一つに記載のデータ分割装置。
【請求項６】
前記更新部は、前記格納制御部によってデータが前記データ記憶部に格納されるのに伴って、前記データが追加されたグループ内のデータ数を１増加させた後、前記データが格納されたグループに属するデータ数と他のグループに属するデータ数との差分が所定値を超える場合に、前記データが格納されたグループの先頭情報と末尾情報との間に位置するデータ数を１つ減らして各グループに属するデータ数の差が１つ以下となるように、前記データが格納されたグループに対応付けられる先頭情報または末尾情報を更新する請求項１に記載のデータ分割装置。
【請求項７】
コンピュータが、
特定の項目でソートした複数のデータを記憶するデータ記憶部にデータを格納する場合に、当該データが有する前記特定の項目に基づいて特定される位置に格納し、
前記データが前記データ記憶部に格納された場合に、前記データ記憶部に記憶される前記データが予め定めたグループ数に分割される各グループに属するデータ数の差が１つ以下となるように、前記グループごとに当該グループ内の先頭に位置するデータを特定する先頭情報と当該グループ内の末尾に位置するデータを特定する末尾情報とを記憶する情報記憶部における前記グループごとの先頭情報と末尾情報とを更新する
処理を含んだことを特徴とするデータ分割方法。
【請求項８】
コンピュータに、
特定の項目でソートした複数のデータを記憶するデータ記憶部にデータを格納する場合に、当該データが有する前記特定の項目に基づいて特定される位置に格納し、
前記データが前記データ記憶部に格納された場合に、前記データ記憶部に記憶される前記データが予め定めたグループ数に分割される各グループに属するデータ数の差が１つ以下となるように、前記グループごとに当該グループ内の先頭に位置するデータを特定する先頭情報と当該グループ内の末尾に位置するデータを特定する末尾情報とを記憶する情報記憶部における前記グループごとの先頭情報と末尾情報とを更新する
処理を実行させることを特徴とするデータ分割プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データ分割装置、データ分割方法およびデータ分割プログラムに関する。
【背景技術】
【０００２】
近年、ネットワーク技術やセンサー技術の発達と普及に伴い、時々刻々と大量に発生するストリームデータを、リアルタイムに処理することを目的としたストリーム処理が注目されている。
【０００３】
ストリーム処理の利用例を挙げると、ストリームデータとしてＰＯＳ（Point  of  sale  system）データを受信し、受信したＰＯＳデータを複数のグループに分割して、即時的な売り上げを集計することに利用されている。また、ストリームデータとしてプローブ交通情報を受信して、受信したプローブ交通情報を複数のグループに分割して、即時的な交通量を集計することに利用されている。
【０００４】
このようなストリーム処理としては、ストリームデータをレコードとして蓄積し、ユーザから指示があった場合に、蓄積されるレコードを分割する技術が知られている。一例を挙げると、連番などのレコードを特定する項目を持たないストリームデータを、ストリームデータ中の特定の項目でソートしながら蓄積する。なお、連番とは、例えばデータに対して上からまたは下から順番に割り当てる番号などである。そして、ユーザから分割要求を受け付けた場合に、ソートされて蓄積されるレコードを分割してユーザに出力する。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００７−１１７８４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、従来技術では、連番などレコードを特定する項目が含まれないストリームデータをグループ分けするには時間がかかるという問題がある。
【０００７】
例えば、蓄積後にソートされたストリームデータをグループ分けする場合に、全体のデータ件数に対してどのレコードが分割位置になるかを特定する。そして、分割位置として特定されたレコードまで蓄積されたレコードを逐次読み込み、読み込んだレコードまでを１グループとして分割することになる。したがって、複数のグループに分割する場合には、１つのグループごとに、分割位置の特定、レコード読み込み、グループ化を繰り返すことになるので、全レコードを複数のグループを分けるのに時間がかかる。
【０００８】
なお、蓄積してソートされた後に、ストリームデータ各々に連番を与えることも考えられるが、ストリームデータを受信するたびにソートを実行して、ソート後に新たに連番を毎回与える処理を実行することは、処理負荷が大きく現実的ではない。
【０００９】
開示の技術は、上記に鑑みてなされたものであって、連番を持たせることなくグループ分けにかかる時間を短縮できるデータ分割装置、データ分割方法およびデータ分割プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
本願の開示するデータ分割装置、データ分割方法およびデータ分割プログラムは、一つの態様において、前後のデータを特定する前後情報を対応付けた複数のデータを記憶するデータ記憶部を有する。また、前記データ記憶部に記憶されるデータが予め定めたグループ数に分割されるグループごとに、当該グループ内の先頭に位置するデータを特定する先頭情報と当該グループ内の末尾に位置するデータを特定する末尾情報とを記憶する情報記憶部を有する。また、前記データ記憶部にデータを格納する場合に、当該データが有する項目に基づいて当該データの前後となるデータを特定し、当該前後のデータを特定する前後情報を対応付けて前記データ記憶部に格納する格納制御部を有する。また、前記格納制御部によってデータが挿入された場合に、前記各グループに属するデータ数の差が１つ以下となるように、前記情報記憶部に記憶される前記グループごとの先頭情報と末尾情報とを更新する更新部を有する。
【発明の効果】
【００１１】
本願の開示するデータ分割装置、データ分割方法およびデータ分割プログラムの一つの態様によれば、連番を持たせることなくグループ分けにかかる時間を短縮できるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】図１は、実施例１に係るシステムの全体構成例を示す図である。
【図２】図２は、実施例１に係るデータ分割装置の構成を示す機能ブロック図である。
【図３】図３は、受信済みＤＢに記憶される情報の例を示す図である。
【図４】図４は、受信済みＤＢの実装例を示す図である。
【図５】図５は、バケットおよび分割境界を説明する図である。
【図６】図６は、分割境界ＤＢに記憶される情報の例を示す図である。
【図７】図７は、バケットの拡張例１を説明する図である。
【図８】図８は、バケットの拡張例２を説明する図である。
【図９】図９は、バケットの縮退例１を説明する図である。
【図１０】図１０は、バケットの縮退例２を説明する図である。
【図１１】図１１は、バケットのスライド例１を説明する図である。
【図１２】図１２は、バケットのスライド例２を説明する図である。
【図１３】図１３は、データ分割装置によるデータ分割から出力までの一連の流れを示すフローチャートである。
【図１４】図１４は、データ分割装置による分割境界更新処理の流れを示すフローチャートである。
【図１５】図１５は、分割境界更新処理のサブフロー１の流れを示すフローチャートである。
【図１６】図１６は、分割境界更新処理のサブフロー２の流れを示すフローチャートである。
【図１７】図１７は、具体例として取り上げるストリームデータの例を示す図である。
【図１８】図１８は、具体例として取り上げる分割境界の例を示す図である。
【図１９】図１９は、具体的な分割例を説明する図である。
【図２０】図２０は、具体的な分割例を説明する図である。
【図２１】図２１は、具体的な分割例を説明する図である。
【図２２】図２２は、具体的な分割例を説明する図である。
【図２３】図２３は、具体的な分割例を説明する図である。
【図２４】図２４は、具体的な分割例を説明する図である。
【図２５】図２５は、具体的な分割例を説明する図である。
【図２６】図２６は、具体的な分割例を説明する図である。
【図２７】図２７は、具体的な分割例を説明する図である。
【図２８】図２８は、具体的な分割例による処理結果を示す図である。
【図２９】図２９は、データ分割装置がデータ分割を実行した結果を示す図である。
【図３０】図３０は、具体的なデータ出力例を説明する図である。
【図３１】図３１は、具体的なデータ出力例を説明する図である。
【図３２】図３２は、具体的なデータ出力例を説明する図である。
【図３３】図３３は、データ分割プログラムを実行するコンピュータのハードウェア構成例を示す図である。
【発明を実施するための形態】
【００１３】
以下に、本願の開示するデータ分割装置、データ分割方法およびデータ分割プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００１４】
実施例１では、データ分割装置を含むシステムの全体構成例、データ分割装置の構成を示す機能ブロック図、処理の流れ等について説明する。
【００１５】
［全体構成］
図１は、実施例１に係るシステムの全体構成例を示す図である。図１に示すように、このシステムは、ストリームデータ発生装置１とデータ分割装置１０とユーザ端末５とを有する。ストリームデータ発生装置１とデータ分割装置１０とはネットワークを介して接続され、同様に、ユーザ端末５とデータ分割装置１０とはネットワークを介して接続される。
【００１６】
ストリームデータ発生装置１は、ストリームデータを発生させた順番でデータ分割装置１０に送信する装置である。例えば、ストリームデータ発生装置１は、ＰＯＳデータやプローブ交通情報をストリームデータとしてデータ分割装置１０に送信する。なお、実施例１では、ストリームデータとしてＰＯＳデータを用いた例で説明する。
【００１７】
ユーザ端末５は、ストリームデータ発生装置１が発生させるストリームデータを管理したり、解析したりするユーザが利用する装置である。このユーザ端末５は、データ分割装置１０から所望のストリームデータを取得する。ユーザは、ユーザ端末５を用いて取得したストリームデータを解析して、即時的な売り上げを集計したり、即時的な交通量を集計したりする。
【００１８】
データ分割装置１０は、ストリームデータ発生装置１からストリームデータを受信し、前後のデータを特定する前後情報を対応付けた複数のデータを記憶する。そして、データ分割装置１０は、記憶されるデータが予め定めたグループ数に分割されるグループごとに、当該グループ内の先頭に位置するデータを特定する先頭情報と当該グループ内の末尾に位置するデータを特定する末尾情報とを記憶する。その後、データ分割装置１０は、新たにデータを格納する場合に、当該データが有する項目に基づいて当該データの前後となるデータを特定し、当該前後のデータを特定する前後情報を対応付けて格納する。そして、データ分割装置１０は、データが格納された場合に、各グループに属するデータ数の差が１つ以下となるように、グループごとの先頭情報と末尾情報とを更新する。
【００１９】
このように、データ分割装置１０は、ストリームデータを１件受信するごとに、分割の境界である先頭情報と末尾情報とを逐次更新し、受信済みのストリームデータを均等に分割することができる。したがって、データ分割装置１０は、連番を持たせることなくグループ分けすることができるので、データの分割にかかる時間を短縮できる。
【００２０】
［データ分割装置の構成］
図２は、実施例１に係るデータ分割装置の構成を示す機能ブロック図である。図２に示すように、このデータ分割装置１０は、通信制御Ｉ／Ｆ（Inter  Face）部１１と、記憶部１２と、制御部１３とを有する。なお、記憶部１２は、半導体メモリ素子やハードディスクなどの記憶装置である。制御部１３は、ＦＰＧＡ（Field-Programmable  Gate  Array）などの集積回路やＣＰＵ（Central  Processing  Unit）などの電子回路である。データ分割装置１０が有する処理部等はあくまで例示でありこれに限定されるものではなく、例えば、マウスなどの入力装置やディスプレイなどの表示装置を有していてもよい。
【００２１】
通信制御Ｉ／Ｆ部１１は、他の装置との通信を制御するインタフェースであり、例えばネットワークインタフェースカードなどである。例えば、通信制御Ｉ／Ｆ部１１は、ストリームデータ発生装置１からストリームデータを受信して制御部１３に出力する。また、通信制御Ｉ／Ｆ部１１は、ユーザ端末５からデータ取得要求を受信して制御部１３に出力し、制御部１３から出力されたデータをユーザ端末５に送信する。
【００２２】
記憶部１２は、制御部１３が実行するプログラムやデータを記憶するとともに、受信済みＤＢ１２ａと分割境界ＤＢ１２ｂとを有する。なお、記憶部１２は、制御部１３が有する各種処理部が処理を実行する際にデータを一時的に格納する作業領域等も有する。
【００２３】
受信済みＤＢ１２ａは、前後のデータを特定する前後情報を対応付けた複数のデータを記憶するデータベースである。つまり、受信済みＤＢ１２ａは、所定の順序で整列させたストリームデータを記憶するデータベースである。図３は、受信済みＤＢに記憶される情報の例を示す図である。図３に示すように、受信済みＤＢ１２ａは、「時刻、名前、年齢、年収（万円）、支払（円）」を１レコードとして記憶する。ここで記憶される「時刻」は、当該ストリームデータを受信した時刻であり、「名前」は、ＰＯＳデータとして通知されたユーザの名前である。「年齢」は、ユーザの年齢であり、「年収」は、ユーザの年収であり、「支払」は、ユーザが支払った金額である。なお、ここで示した情報はあくまで例示であり、これに限定されるものではなく、任意に設定変更することができる。
【００２４】
実施例１では、図３に示すように、受信済みＤＢ１２ａは、年収で昇順にソートされた情報を記憶するが、これに限定されるものではなく、任意にソート対象等を変更できる。図３の場合には、時刻「９」に受信された年収「１２００万円」の「Ｉｒｉｓ」を先頭にして、「Ｄｉｃｋ」、「Ｅｒｉｋ」、「Ｈｅｎｒｙ」、「Ｇｅｏｒｇｅ」、「Ｂｏｂ」、「Ａｌｉｃｅ」、「Ｃａｒｅｎ」、「Ｆｒａｎｋ」の順番で記憶する。
【００２５】
次に、受信済みＤＢ１２ａがデータを記憶する実装例を説明する。図４は、受信済みＤＢの実装例を示す図である。図４に示すように、受信済みＤＢ１２ａは、データに当該データの前後のデータを特定するポインタを対応付けて記憶する。具体的には、時刻９のＩｒｉｓには、前データのポインタとしてＮＵＬＬが対応付けられているとともに、後ろデータのポインタとして時刻４のＤｉｃｋが対応付けられている。同様に、時刻４のＤｉｃｋには、前データのポインタとして時刻９のＩｒｉｓが対応付けられているとともに、後ろデータのポインタとして時刻５のＥｒｉｋが対応付けられている。同様に、時刻５のＥｒｉｋには、前データのポインタとして時刻４のＤｉｃｋが対応付けられているとともに、後ろデータのポインタとして時刻８のＨｅｎｒｙが対応付けられている。同様に、時刻８のＨｅｎｒｙには、前データのポインタとして時刻５のＥｒｉｋが対応付けられているとともに、後ろデータのポインタとしてＮＵＬＬが対応付けられている。なお、実装例はあくまで例であり、これに限定されるものではない。
【００２６】
ここで、実施例１の説明に用いる用語について説明する。実施例１では、ソート後に均等分割された個々のデータ集合を「バケット」と呼ぶ。また、各バケットの境を「分割境界」と呼ぶ。また、「均等分割」とは、データ数Ｎが分割数Ｍで割り切れない場合に、各バケットの大きさの差がたかだか１となるように分割することを言う。つまり、データ数が１０で分割数が３の場合には、「２」、「３」、「５」などのように分割されたデータ数の差が２以上になるように分割することではなく、「３」、「３」、「４」などのように分割されたデータ数の差が１以下に分割することをいう。なお、属するデータ数が多いバケットを「大バケット」と呼び、小さい方のバケットを「小バケット」と呼ぶ。また、データ数Ｎが分割数Ｍで割り切れる場合は、全バケットの大きさが等しくなるよう均等分割を行い、このときは、便宜上、全バケットを「小バケット」とみなす。
【００２７】
続いて、上記用語の具体例を説明する。図５は、バケットおよび分割境界を説明する図である。図５に示す例は、時刻１から９までのストリームデータを年収でソートして昇順に並べた例である。この例では、データ数が９個であることより、各バケットに属するデータ数が３個となる。具体的には、データ分割装置１０は、時刻９、時刻４、時刻５をバケット（Ｄ１）、時刻８、時刻７、時刻２をバケット（Ｄ２）、時刻１、時刻６、時刻３をバケット（Ｄ３）に分割する。また、バケット（Ｄ１）とバケット（Ｄ２）との境界およびバケット（Ｄ２）とバケット（Ｄ３）との境界各々が分割境界となる。
【００２８】
図２に戻り、分割境界ＤＢ１２ｂは、分割境界を特定する情報を記憶するデータベースである。図６は、分割境界ＤＢに記憶される情報の例を示す図である。図６に示すように、分割境界ＤＢ１２ｂは、「バケット名、データ数（サイズ）、先頭情報、末尾情報」を対応付けて記憶する。ここで記憶される「バケット名」は、バケットを識別する識別子であり、例えばバケットの名称などである。「データ数（サイズ）」は、バケットに属するデータの数であり、データ数が３個の場合にはサイズが３である。「先頭情報」は、バケットに属するデータの先頭を示すポインタであり、例えば「時刻」などデータを識別できる任意の項目や、該当データの論理アドレスなどで指定できる。「末尾情報」は、バケットに属するデータの末尾を示すポインタであり、例えば「時刻」などデータを識別できる任意の項目や、該当データの論理アドレスなどで指定できる。実施例１では、「先頭情報」および「末尾情報」として「時刻」を用いることとする。
【００２９】
なお、サイズ０およびサイズ１のバケットの情報は、便宜上、以下を満たすように分割境界ＤＢ１２ｂに格納することを仮定する。サイズ０のバケットに対応する「先頭情報」と「末尾情報」は、共に「ＮＵＬＬ」とする。分割境界ＤＢにおいて「先頭情報」および「末尾情報」として格納される「ＮＵＬＬ」は、便宜上、受信済みＤＢ１２ａの最終データの１つ下にある仮想的な末端データを表わしているとみなす。また、サイズ１のバケットに対応する「先頭情報」と「末尾情報」には、共に、そのバケットに唯一含まれるデータが格納される。
【００３０】
図６の例は、バケット（Ｄ１）には、時刻９のデータから時刻５のデータまでの３つのデータが属することを示す。バケット（Ｄ２）には、時刻８のデータから時刻２のデータまでの３つのデータが属することを示す。バケット（Ｄ３）には、時刻１のデータから時刻６のデータまでの３つのデータが属することを示す。なお、図６に示したデータベースの例はあくまで例示であり、これに限定されるものではなく、例えば図３と同様の実装形式を用いることもでき、他のデータ形式を用いることもできる。同様に、ソート済みのストリームデータ群についても任意のデータ形式を用いることができる。
【００３１】
制御部１３は、データ分割装置１０を全体的に制御する処理部であり、分割数設定部１４と分割処理部１５と出力部２１とを有する。分割数設定部１４は、ユーザ端末５等から分割数を受け付けて、分割処理部１５に通知する処理部である。例えば、分割数設定部１４は、ユーザ端末５から分割数「３」を受け付けると、受け付けた分割数を分割処理部１５に通知し、記憶部１２の作業領域等に格納する。また、分割数設定部１４は、ソート対象とするデータ項目をユーザ端末５等から分割数を受け付けて、分割処理部１５に通知する。
【００３２】
分割処理部１５は、受信部１６と位置特定部１７と格納制御部１８とバケット判定部１９と更新部２０とを有し、これらによって、受信済みのストリームデータを均等分割する処理部である。
【００３３】
受信部１６は、ストリームデータ発生装置１からストリームデータを受信する処理部である。受信部１６は、ストリームデータ発生装置１からストリームデータを受信し、受信したストリームデータを位置特定部１７に出力する。なお、受信部１６は、受信したストリームデータを受信順に記憶部１２の作業領域等に格納してもよい。
【００３４】
位置特定部１７は、受信部１６が受信したストリームデータに対して、受信済みＤＢ１２ａへの挿入位置を特定し、特定した結果を格納制御部１８に通知する処理部である。例えば、位置特定部１７は、受信されたストリームデータからソート対象のデータ項目を特定し、該当する値を抽出する。そして、位置特定部１７は、受信済みＤＢ１２ａに記憶されるストリームデータの各レコードにおけるソート対象のデータ項目を参照し、抽出した値の挿入位置を特定する。
【００３５】
具体的な例を挙げると、位置特定部１７は、図３に示したデータが受信済みＤＢ１２ａに記憶されている状態で、「時刻、名前、年齢、年収、支払」として「１０、Ｊａｎｅ、４５、９００、２３００」を受信したとする。この場合、位置特定部１７は、受信したストリームデータからソート対象の項目である「年収」を特定し、該当する値として「９００」を抽出する。その後、位置特定部１７は、受信済みＤＢ１２ａに記憶されるストリームデータの各レコードにおけるソート対象のデータ項目を参照し、年収「１０００」のレコードと年収「８００」のレコードの間が、抽出した「９００」の挿入位置であると特定する。
【００３６】
別例を挙げると、位置特定部１７は、受信されたストリームデータを記憶部１２の作業領域に格納し、この時点で受信済みデータをソートして並び替える。そして、位置特定部１７は、並び替えたデータと受信済みＤＢ１２ａに記憶されるストリームデータとを比較して、受信されたストリームデータの挿入位置を判定することもできる。
【００３７】
さらに別例を挙げると、位置特定部１７は、図３に示した受信済みＤＢ１２ａと図６に示した分割境界ＤＢ１２ｂが与えられた状態で、「時刻、名前、年齢、年収、支払」として「１０、Ｊａｎｅ、４５、９００、２３００」を受信したとする。この場合、位置特定部１７は、受信したストリームデータからソート対象の項目である「年収」を特定し、該当する値として「９００」を抽出する。その後、位置特定部１７は、分割境界ＤＢ１２ｂに登録された各バケットの「先頭情報」と「末尾情報」を参照し、さらに受信済みＤＢ１２ａを参照することにより、各バケットの先頭データと末尾データにおける年収を抽出し、挿入されるバケットをまずは特定する。具体的には、バケットＤ１の先頭データと末尾データの年収は、それぞれ「１２００」と「８００」であるので、「９００」の挿入されるバケットはＤ１であることを特定する。そして、受信済みＤＢ１２ａにおけるバケットＤ１の先頭データから末尾データまでをさらに参照することで、年収「１０００」のレコードと年収「８００」のレコードの間が、抽出した「９００」の挿入位置であると特定する。また、受信したデータがどのバケットにも挿入されない場合として、隣接するバケットの境界に挿入される場合と、受信済みＤＢの先頭または末尾に挿入される場合があるが、いずれの場合も、分割境界ＤＢ１２ｂの「先頭情報」と「末尾情報」を用いて、データの挿入位置を特定することができる。
【００３８】
格納制御部１８は、受信済みＤＢ１２ａにデータを格納する場合に、当該データが有する項目に基づいて当該データの前後となるデータを特定し、当該前後のデータを特定する前後情報を対応付けて受信済みＤＢ１２ａに格納する処理部である。言い換えると、格納制御部１８は、位置特定部１７によって特定された挿入位置に、受信部１６によって受信されたストリームデータを挿入する処理部である。
【００３９】
上記例で説明すると、年収「１０００」のレコードと年収「８００」のレコードの間が挿入位置として特定されたとする。この場合、格納制御部１８は、受信された「１０、Ｊａｎｅ、４５、９００、２３００」を年収「１０００」のレコードと年収「８００」のレコードの間に挿入する。このとき、格納制御部１８は、年収「１０００」のレコードに対応付けられる前後情報のうち、後ろのポインタを「時刻５、Ｅｒｉｋ」から「時刻１０、Ｊａｎｅ」に変更する。また、格納制御部１８は、年収「８００」のレコードに対応付けられる前後情報のうち、前のポインタを「時刻４、Ｄｉｃｋ」から「時刻１０、Ｊａｎｅ」に変更する。そして、格納制御部１８は、データ「１０、Ｊａｎｅ、４５、９００、２３００」に対しては、前後情報として前のポインタを「時刻４  Ｄｉｃｋ」、後ろのポインタを「時刻５、Ｅｒｉｋ」を格納する。このようにして、格納制御部１８は、受信済みＤＢ１２ａに新たなデータを格納する。なお、格納制御部１８は、新たなストリームデータを受信済みＤＢ１２ａに格納したことをバケット判定部１９に通知する。
【００４０】
バケット判定部１９は、受信済みＤＢ１２ａに記憶されるデータをグループ化する各バケットが小バケットか大バケットかを判定する処理部である。例えば、バケット判定部１９は、格納制御部１８によってデータが格納された場合に、各バケットに属するデータ数をスキャンするとともに、受信済みＤＢ１２ａや分割境界ＤＢ１２ｂを参照し、各バケットの大小を特定する。そして、バケット判定部１９は、特定した情報を更新部２０に通知する。
【００４１】
更新部２０は、拡張実行部２０ａと縮退実行部２０ｂとスライド実行部２０ｃとを有する。更新部２０は、これらの処理部によって、格納制御部１８によってデータが挿入された場合に、各グループに属するデータ数の差が１つ以下となるように、分割境界ＤＢ１２ｂに記憶されるグループごとの先頭情報と末尾情報とを更新する。
【００４２】
拡張実行部２０ａは、指定したバケットを上または下方向に拡張し、分割境界ＤＢ１２ｂを拡張させた後のバケット情報に更新する処理部である。図７は、バケットの拡張例１を説明する図である。図７に示すように、拡張実行部２０ａは、バケット判定部１９の判定結果に基づいてバケット（Ｄｐ）を上方向に拡張させると判定する。この場合、拡張実行部２０ａは、バケット（Ｄｐ）の先頭情報を１件上のデータに置き換えてデータ数を１つ増やして、バケット（Ｄｐ）を上方向に拡張させる。このように、バケット（Ｄｐ）を上方向に拡張させる方法をｕｐｅｘｐａｎｄ（ｐ）と呼ぶ。また、図７に示した空白はソートされたレコード（データ）を示す。なお、拡張実行部２０ａがバケットＤｐを上方向に拡張させると判定する例については、フローの説明で詳細に説明する。
【００４３】
また、図８は、バケットの拡張例２を説明する図である。図８に示すように、拡張実行部２０ａは、バケット判定部１９の判定結果に基づいてバケット（Ｄｐ）を下方向に拡張させると判定する。この場合、拡張実行部２０ａは、バケット（Ｄｐ）の末尾情報を１件下のデータに置き換えてデータ数を１つ増やして、バケット（Ｄｐ）を下方向に拡張させる。このように、バケット（Ｄｐ）を下方向に拡張させる方法をｄｏｗｎｅｘｐａｎｄ（ｐ）と呼ぶ。また、図８に示した空白はソートされたレコード（データ）を示す。なお、拡張実行部２０ａがバケットＤｐを下方向に拡張させると判定する例については、フローの説明で詳細に説明する。
【００４４】
縮退実行部２０ｂは、指定したバケットを上または下方向に縮退させ、分割境界ＤＢ１２ｂを縮退させた後のバケット情報に更新する処理部である。図９は、バケットの縮退例１を説明する図である。図９に示すように、縮退実行部２０ｂは、バケット判定部１９の判定結果に基づいてバケット（Ｄｐ）を上方向に縮退させると判定する。この場合、縮退実行部２０ｂは、バケット（Ｄｐ）の末尾情報を１件上のデータに置き換えてデータ数を１つ減らし、バケットＤｐを上方向に縮退させる。このように、バケット（Ｄｐ）を上方向に縮退させる方法をｕｐｓｈｒｉｎｋ（ｐ）と呼ぶ。また、図９に示した空白はソートされたレコード（データ）を示す。
【００４５】
また、図１０は、バケットの縮退例２を説明する図である。図１０に示すように、縮退実行部２０ｂは、バケット判定部１９の判定結果に基づいてバケット（Ｄｐ）を下方向に縮退させると判定する。この場合、縮退実行部２０ｂは、バケット（Ｄｐ）の先頭情報を１件下のデータに置き換えてデータ数を１つ減らしバケット（Ｄｐ）を下方向に縮退させる。このように、バケットＤｐを下方向に縮退させる方法をｄｏｗｎｓｈｒｉｎｋ（ｐ）と呼ぶ。また、図１０に示した空白はソートされたレコード（データ）を示す。なお、縮退実行部２０ｂがバケットＤｐを上方向または下方向に縮退させると判定する例については、フローの説明で詳細に説明する。
【００４６】
スライド実行部２０ｃは、各バケットに属するデータ数を変えることなく、連続した複数のバケットを上方向または下方向に１ずつずらす処理部である。図１１は、バケットのスライド例１を説明する図である。図１１に示すように、スライド実行部２０ｃは、バケット判定部１９の判定結果に基づいてバケット（Ｄｐ）からバケット（Ｄｑ）までを上にスライドさせると判定する。この場合、スライド実行部２０ｃは、バケット（Ｄｐ）からバケット（Ｄｑ）に対して、各バケットの大きさを変えることなく、データを上へ１件ずつずらす操作を行う。すなわち、スライド実行部２０ｃは、対象となるバケット（Ｄｐ）からバケット（Ｄｑ）各々の先頭および末尾情報を、それぞれ１件上のデータに置き換える。なお、ここではｐ＜ｑと仮定する。このように、バケット（Ｄｐ）からバケット（Ｄｑ）を上方向にスライドさせる方法をｕｐｓｌｉｄｅ（ｐ、ｑ）と呼ぶ。また、図１１に示した空白はソートされたレコード（データ）を示す。
【００４７】
また、図１２は、バケットのスライド例２を説明する図である。図１２に示すように、スライド実行部２０ｃは、バケット判定部１９の判定結果に基づいてバケット（Ｄｐ）からバケット（Ｄｑ）までを下にスライドさせると判定する。この場合、スライド実行部２０ｃは、バケット（Ｄｐ）からバケット（Ｄｑ）に対して、各バケットの大きさを変えることなく、データを下へ１件ずつずらす操作を行う。すなわち、スライド実行部２０ｃは、対象となるバケット（Ｄｐ）からバケット（Ｄｑ）各々の先頭および末尾情報を、それぞれ１件下のデータに置き換える。なお、ここではｐ＜ｑと仮定する。このように、バケット（Ｄｐ）からバケット（Ｄｑ）を下方向にスライドさせる方法をｄｏｗｎｓｌｉｄｅ（ｐ、ｑ）と呼ぶ。また、図１２に示した空白はソートされたレコード（データ）を示す。なお、スライド実行部２０ｃが各バケットを上方向または下方向にスライドさせると判定する例については、フローの説明で詳細に説明する。
【００４８】
出力部２１は、受信済みＤＢ１２ａに記憶されるデータが分割されるグループのうち、ユーザに指定されたグループの先頭情報と末尾情報とを分割境界ＤＢ１２ｂから読み出す。そして、出力部２１は、読み出した先頭情報に該当するデータから末尾情報に該当するデータまでのデータを受信済みＤＢ１２ａから読み出して、所定の装置に出力する処理部である。
【００４９】
例えば、出力部２１がユーザ端末５からバケット（Ｄ１）からバケット（Ｄ２）の出力依頼を受信したとする。この場合、出力部２１は、まず、バケット（Ｄ１）の先頭情報と末尾情報を分割境界ＤＢ１２ｂから取得する。続いて、出力部２１は、取得した先頭情報によって特定されるレコードから、末尾情報によって特定されるレコードまでに位置する各レコードを読み出す。その後、出力部２１は、読み出した各レコードをバケット（Ｄ１）のデータとしてユーザ端末５に送信する。
【００５０】
続いて、出力部２１は、バケット（Ｄ２）の先頭情報と末尾情報を分割境界ＤＢ１２ｂから取得する。続いて、出力部２１は、取得した先頭情報によって特定されるレコードから、末尾情報によって特定されるレコードまでに位置する各レコードを読み出す。その後、出力部２１は、読み出した各レコードをバケット（Ｄ２）のデータとしてユーザ端末５に送信する。
【００５１】
［処理の流れ］
次に、図１３から図１６を用いてデータ分割装置１０が実行する処理の流れを説明する。まず、全体的な処理の流れを説明し、次に、サブフローなどの各処理について説明する。
【００５２】
（全体的な処理の流れ）
図１３は、データ分割装置によるデータ分割から出力までの一連の流れを示すフローチャートである。なお、ここでは、受信部１６が、受信したストリームデータを順番に記憶部１２の作業領域等に格納している例で説明する。また、記憶されるストリームデータをＳ［ｉ］（ｉは自然数）とする。
【００５３】
図１３に示すように、格納制御部１８は、記憶されるストリームデータの先頭のデータであるＳ［１］を記憶部１２から読み出して受信済みＤＢ１２ａの先頭バケットに格納する（Ｓ１０１）。
【００５４】
続いて、位置特定部１７は、ｉをインクリメントしてｉ＝２とし（Ｓ１０２）、ストリームデータＳ［ｉ］が記憶部１２の作業領域等に格納されているか否かを判定する（Ｓ１０３）。そして、位置特定部１７は、ストリームデータＳ［ｉ］が存在しない場合は（Ｓ１０３否定）、処理を終了する。
【００５５】
一方、ストリームデータＳ［ｉ］が存在する場合は（Ｓ１０３肯定）、位置特定部１７は、ストリームデータＳ［ｉ］を作業領域等から読み込み（Ｓ１０４）、ソート対象の項目にしたがって、受信済みＤＢ１２ａにおける挿入位置（ｊ）を特定する。そして、格納制御部１８は、位置特定部１７が特定した挿入位置（ｊ）にストリームデータＳ［ｉ］を挿入する（Ｓ１０５）。つまり、格納制御部１８は、挿入したストリームデータＳ［ｉ］の前後情報と、挿入位置の前後のデータ各々の前後情報とを更新する。
【００５６】
その後、バケット判定部１９と更新部２０とは、分割境界更新処理を実行して、バケットの分割境界を更新する（Ｓ１０６）。当該処理が終了した後、現在の時刻ｉの時点で出力要求を受信した場合には（Ｓ１０７肯定）、出力部２１は、ユーザ端末５から指示されたバケットに該当するデータを受信済みＤＢ１２ａから読み出して、ユーザ端末５に出力する（Ｓ１０８）。
【００５７】
そして、位置特定部１７は、ｉをインクリメントした後（Ｓ１０９）、Ｓ１０３以降の処理を繰り返す。また、Ｓ１０７において出力要求を受信していない場合には（Ｓ１０７否定）、位置特定部１７は、Ｓ１０８を実行することなく、Ｓ１０９を実行する。
【００５８】
（分割境界更新処理の流れ）
図１４は、データ分割装置による分割境界更新処理の流れを示すフローチャートである。図１４に示すように、バケット判定部１９は、新たなデータ（以下、挿入データ（ｄ）と呼ぶ）がバケット（Ｄｐ）の内部に挿入されたか否かを判定する（Ｓ２０１）。
【００５９】
例えば、バケット判定部１９は、挿入されたデータがどの時刻とどの時刻の間かを受信済みＤＢ１２ａを参照して特定する。続いて、バケット判定部１９は、受信済みＤＢ１２ａと分割境界ＤＢ１２ｂを参照して、特定した両時刻の位置がいずれかのバケットの内部か否かを判定する。
【００６０】
一例として、図４と図５に示したデータにおいて、時刻９と時刻４との間に時刻１０のデータが挿入されたとする。この場合、バケット判定部１９は、挿入された位置が時刻９と時刻４の間であることを、挿入前の受信済みＤＢ１２ａと挿入後の受信済みＤＢ１２ａとの比較によって特定する。続いて、バケット判定部１９は、図５を参照して、時刻９と時刻４のデータがバケット（Ｄ１）に属することを特定し、バケット（Ｄ１）には時刻９、時刻４、時刻５のデータが存在することを特定する。この結果、バケット判定部１９は、時刻４の後ろに時刻５のデータが存在することから、時刻１０のデータがバケット内部に挿入されたと判定する。
【００６１】
図１４に戻り、バケット判定部１９は、挿入データ（ｄ）がバケット（Ｄｐ）の内部に挿入された場合（Ｓ２０１肯定）、データが挿入されたバケットが小バケットか否かを判定する（Ｓ２０２）。
【００６２】
一例を挙げると、図５に示したように、全バケットのデータ数が３である状態でバケット（Ｄ１）にデータが挿入されたとする。この場合、バケット判定部１９は、バケット（Ｄ１）のデータ数が４となり、他のバケットとのデータ数の差が１以上であることから、データが挿入されたバケットは大バケットと判定する。別の例としては、バケット（Ｄ１）のデータ数が「３」、バケット（Ｄ２）のデータ数が「３」、バケット（Ｄ３）のデータ数が「２」の状態でバケット（Ｄ３）にデータが挿入されたとする。この場合、バケット判定部１９は、バケット（Ｄ３）のデータ数が３となり、他のバケットとのデータ数の差が１未満であることから、データが挿入されたバケットは小バケットと判定する。
【００６３】
図１４に戻り、バケット判定部１９がバケット（Ｄｐ）を小バケットと判定すると（Ｓ２０２肯定）、更新部２０は、「処理１」を実行する（Ｓ２０３）。すなわち、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄｐ）のデータ数を１増やす。その後、処理を終了する。
【００６４】
一方、バケット判定部１９がバケット（Ｄｐ）を大バケットと判定すると（Ｓ２０２否定）、更新部２０は、「処理２」を実行し（Ｓ２０４）、処理を終了する。すなわち、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄｐ）のデータ数を１増やし、バケット（Ｄｐ）の一番近くにある小バケットをバケット（Ｄｑ）とする。
【００６５】
ここで、ｐ＜ｑであるならば、つまり、バケット（Ｄｐ）の方がバケット（Ｄｑ）よりも上に存在する場合に、更新部２０は、ｕｐｓｌｉｄｅ（ｐ＋１、ｑ−１）、ｕｐｅｘｐａｎｄ（ｑ）、ｕｐｓｈｒｉｎｋ（ｐ）を実行する。具体的には、スライド実行部２０ｃは、バケット（Ｄｐ）の１つ下のバケットであるバケット（Ｄｐ＋１）から、バケット（Ｄｑ）の１つ上のバケットであるバケット（Ｄｑ−１）までの各バケットの先頭および末尾情報をそれぞれ１件上のデータに置き換える。そして、拡張実行部２０ａは、バケットＤｑの先頭情報を１つ上のデータに置き換えてバケットサイズすなわち属するデータ数を１つ増やして、バケットＤｑを上方向に拡張する。また、縮退実行部２０ｂは、バケットＤｐの末尾情報を１つ上のデータに置き換えてバケットサイズすなわちデータ数を１つ減らし、バケットＤｐを上方向に縮退させる。
【００６６】
一方、ｐ＞ｑであるならば、つまり、バケット（Ｄｐ）の方がバケット（Ｄｑ）よりも下に存在する場合に、更新部２０は、ｄｏｗｎｓｌｉｄｅ（ｑ＋１、ｐ−１）、ｄｏｗｎｅｘｐａｎｄ（ｑ）、ｄｏｗｎｓｈｒｉｎｋ（ｐ）を実行する。具体的には、スライド実行部２０ｃは、バケット（Ｄｑ）の１つ下のバケットであるバケット（Ｄｑ＋１）から、バケット（Ｄｐ）の１つ上のバケットであるバケット（Ｄｐ−１）までの各バケットの先頭情報および末尾情報をそれぞれ１件下のデータに置き換える。そして、拡張実行部２０ａは、バケットＤｑの末尾情報を１つ下のデータに置き換えてデータ数を１つ増やして、バケットＤｑを下方向に拡張させる。また、縮退実行部２０ｂは、バケットＤｐの先頭情報を１つ下のデータに置き換えてデータ数を１つ減らし、バケットＤｐを下方向に縮退させる。
【００６７】
図１４に戻り、バケット判定部１９は、挿入データ（ｄ）がバケット（Ｄｐ）の内部に挿入されていないと判定した場合（Ｓ２０１否定）、挿入データ（ｄ）がバケット（Ｄｐ）とバケット（Ｄｐ＋１）の間に挿入されたか否かを判定する（Ｓ２０５）。
【００６８】
一例として、図４と図５に示したデータを用いて説明すると、バケット判定部１９は、時刻５と時刻８の間、または、時刻２と時刻１の間に新たなデータが挿入された場合に、挿入データ（ｄ）がバケットの間に挿入されたと判定する。具体的には、バケット判定部１９は、分割境界ＤＢ１２ｂを参照し、挿入データ（ｄ）の挿入位置がバケット（Ｄｐ）の末尾情報とバケット（Ｄｐ＋１）の先頭情報の間に位置する場合に、バケットの間に挿入されたと判定する。
【００６９】
図１４に戻り、更新部２０は、バケット判定部１９によって挿入データ（ｄ）がバケット（Ｄｐ）とバケット（Ｄｐ＋１）の間に挿入されたと判定された場合（Ｓ２０５肯定）、サブフロー１を実行する（Ｓ２０６）。一方、更新部２０は、バケット判定部１９によって挿入データ（ｄ）がバケット（Ｄｐ）とバケット（Ｄｐ＋１）の間に挿入されていないと判定された場合（Ｓ２０５否定）、サブフロー２を実行する（Ｓ２０７）。
【００７０】
（サブフロー１の流れ）
図１５は、分割境界更新処理のサブフロー１の流れを示すフローチャートである。図１５に示すように、バケット（Ｄｐ）が小バケットであると、バケット判定部１９によって判定された場合（Ｓ３０１肯定）、更新部２０は、「処理３」を実行する（Ｓ３０２）。すなわち、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄｐ）の末尾情報を挿入データ（ｄ）の情報に修正して、データ数を１増やす。
【００７１】
一方、バケット判定部１９は、バケット（Ｄｐ）が小バケットでないと判定した場合（Ｓ３０１否定）、バケット（Ｄｐ）とバケット（Ｄｐ＋１）がともに大バケットであるか否かを判定する（Ｓ３０３）。そして、バケット（Ｄｐ）とバケット（Ｄｐ＋１）がともに大バケットであると、バケット判定部１９によって判定された場合（Ｓ３０３肯定）、更新部２０は、「処理４」を実行する（Ｓ３０４）。
【００７２】
すなわち、更新部２０は、バケット（Ｄｐ）またはバケット（Ｄｐ＋１）の一番近くに位置する小バケットをＤｑとする。そして、ｐ＋１＜ｑであるならば、つまり、バケット（Ｄｐ）の１つ下のバケット（Ｄｐ＋１）の方がバケット（Ｄｑ）よりも上に存在する場合に、更新部２０は、ｕｐｓｌｉｄｅ（ｐ＋１、ｑ−１）、ｕｐｅｘｐａｎｄ（ｑ）を実行する。具体的には、スライド実行部２０ｃは、バケット（Ｄｐ）の１件下のバケットであるバケット（Ｄｐ＋１）から、バケット（Ｄｑ）の１件上のバケットであるバケット（Ｄｑ−１）までの各バケットの先頭情報および末尾情報をそれぞれ１件上のデータに置き換える。さらに、拡張実行部２０ａは、バケット（Ｄｑ）の先頭情報を１件上のデータに置き換えてデータ数を１つ増やし、バケット（Ｄｑ）を上方向に拡張する。
【００７３】
また、ｐ＞ｑであるならば、つまり、バケット（Ｄｐ）の方がバケット（Ｄｑ）よりも下に存在する場合に、更新部２０は、ｄｏｗｎｓｌｉｄｅ（ｐ、ｑ＋１）、ｄｏｗｎｅｘｐａｎｄ（ｑ）を実行する。具体的には、スライド実行部２０ｃは、バケット（Ｄｐ）から、バケット（Ｄｑ）の１件下のバケットであるバケット（Ｄｑ＋１）までの各バケットの先頭情報および末尾情報をそれぞれ１件下のデータに置き換える。さらに、拡張実行部２０ａは、バケット（Ｄｑ）の先頭情報を１件下のデータに置き換えてデータ数を１つ増やし、バケット（Ｄｑ）を下方向に拡張する。
【００７４】
図１５に戻り、バケット（Ｄｐ＋１）が大バケットでないとバケット判定部１９によって判定された場合（Ｓ３０３否定）、更新部２０は、「処理５」を実行する（Ｓ３０５）。すなわち、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄｐ＋１）の先頭情報を挿入データ（ｄ）の情報に修正して、データ数を１増やす。
【００７５】
（サブフロー２の流れ）
図１６は、分割境界更新処理のサブフロー２の流れを示すフローチャートである。図１６に示すように、バケット判定部１９は、受信済みＤＢ１２ａを参照して挿入データ（ｄ）の挿入位置が全データの先頭であると判定した場合（Ｓ４０１肯定）、先頭バケット（Ｄ１）が大バケットであるか否かを判定する（Ｓ４０２）。
【００７６】
そして、バケット判定部１９が分割境界ＤＢ１２ｂ等を参照して先頭バケット（Ｄ１）が大バケットであると判定した場合（Ｓ４０２肯定）、更新部２０は、「処理６」を実行する（Ｓ４０３）。
【００７７】
すなわち、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ１）の先頭情報を挿入データ（ｄ）に修正して、データ数を１増やし、バケット（Ｄ１）の一番近くに位置する小バケットを（Ｄｐ）とする。その後、更新部２０は、ｕｐｓｈｒｉｎｋ（１）とｕｐｓｌｉｄｅ（２、ｑ−１）とｕｐｅｘｐａｎｄ（ｑ）を実行する。具体的には、縮退実行部２０ｂは、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ１）の末尾情報を１件上のデータに置き換えて、データ数を１減らす。また、スライド実行部２０ｃは、分割境界ＤＢ１２ｂにおいてバケット（Ｄ２）からバケット（Ｄｑ−１）までの各バケットの先頭情報および末尾情報をそれぞれ１件上のデータに置き換える。また、拡張実行部２０ａは、分割境界ＤＢ１２ｂにおいてバケット（Ｄｑ）の先頭情報を１件上のデータに置き換えて、データ数を１増やす。
【００７８】
一方、バケット判定部１９が分割境界ＤＢ１２ｂ等を参照して先頭バケット（Ｄ１）が大バケットではないと判定した場合（Ｓ４０２否定）、更新部２０は、「処理７」を実行する（Ｓ４０４）。すなわち、更新部２０は、分割境界ＤＢ１２ｂにおいて、先頭バケット（Ｄ１）の先頭情報を挿入データ（ｄ）の情報に修正して、データ数を１増やす。
【００７９】
また、Ｓ４０１において、バケット判定部１９は、受信済みＤＢ１２ａを参照して挿入データ（ｄ）の挿入位置が全データの先頭でないと判定した場合（Ｓ４０１否定）、末尾バケット（Ｄｍ）が大バケットであるか否かを判定する（Ｓ４０５）。つまり、バケット判定部１９は、挿入データ（ｄ）の挿入位置が末尾であると判定した場合、末尾バケット（Ｄｍ）が大バケットであるか否かを判定する。
【００８０】
そして、バケット判定部１９が分割境界ＤＢ１２ｂ等を参照して末尾バケット（Ｄｍ）が大バケットであると判定した場合（Ｓ４０５肯定）、更新部２０は、「処理８」を実行する（Ｓ４０６）。すなわち、更新部２０は、分割境界ＤＢ１２ｂにおいて、末尾バケット（Ｄｍ）の末尾情報を挿入データ（ｄ）の情報に修正して、データ数を１増やす。
【００８１】
一方、バケット判定部１９が分割境界ＤＢ１２ｂ等を参照して末尾バケット（Ｄｍ）が大バケットでないと判定した場合（Ｓ４０５否定）、更新部２０は、「処理９」を実行する（Ｓ４０７）。
【００８２】
すなわち、更新部２０は、分割境界ＤＢ１２ｂに記憶される末尾バケット（Ｄｍ）の末尾情報を挿入データ（ｄ）の情報に修正してデータ数を１増やし、末尾バケット（Ｄｍ）の一番近くに位置する小バケットを（Ｄｑ）とする。その後、更新部２０は、ｄｏｗｎｓｈｒｉｎｋ（ｍ）とｄｏｗｎｓｌｉｄｅ（ｑ＋１、ｍ−１）とｄｏｗｎｅｘｐａｎｄ（ｑ）を実行する。
【００８３】
具体的には、縮退実行部２０ｂは、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄｍ）の先頭情報を１件下のデータに修正して、データ数を１減らす。また、スライド実行部２０ｃは、分割境界ＤＢ１２ｂにおいて、バケット（Ｄｑ＋１）からバケット（Ｄｍ−１）までの各バケットの先頭情報および末尾情報をそれぞれ１件下のデータに置き換える。また、拡張実行部２０ａは、分割境界ＤＢ１２ｂにおいて、バケット（Ｄｑ）の末尾情報を１件下のデータに置き換えて、データ数を１増やす。
【００８４】
［データ分割の具体例］
次に、図１７から図２８を用いて、ストリームデータを受信して分割境界を更新する一連の処理の具体例を説明する。まず、具体例の説明に用いるデータ例等について説明する。図１７は、具体例として取り上げるストリームデータの例を示す図である。図１８は、具体例として取り上げる分割境界の例を示す図である。
【００８５】
ストリームデータ発生装置１は、図１７に示すストリームデータのうち時刻１から順にデータ分割装置１０に送信し、データ分割装置１０の受信部１６は、時刻１のストリームデータから順に受信する。ストリームデータは、「時刻、名前、年齢、年収（万円）、支払（円）」の項目を有する。なお、受信されたデータは、年収を降順でソートされるものとする。
【００８６】
また、データ分割装置１０の分割境界ＤＢ１２ｂは、図１８に示すように、バケットごとに、データ数と先頭情報と末尾情報とを対応付けて記憶する。ここで記憶されるデータ数は、バケットに属するデータの数である。先頭情報は、バケットの先頭に位置するデータであり、当該データの時刻が格納される。末尾情報は、バケットの末尾に位置するデータであり、当該データの時刻が格納される。なお、ここではバケット数を３として説明する。つまり、受信したデータを３つのグループに分割する例を説明する。
【００８７】
このような状態において、受信部１６が、「１、Ａｌｉｃｅ、２４、３００、１５００」とするストリームデータを受信したとする。すると、位置特定部１７は、受信済みＤＢ１２ａにデータが格納されていないことから、当該「Ａｌｉｃｅ」のデータの格納位置を受信済みＤＢ１２ａの先頭と特定する。そして、格納制御部１８は、「Ａｌｉｃｅ」のデータを受信済みＤＢ１２ａの先頭に格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図１９は、具体的な分割例を説明する図である。図１９に示すように、更新部２０は、先頭のバケットであるバケット（Ｄ１）の先頭情報および末尾情報各々に「Ａｌｉｃｅ」のデータを特定する「時刻１」を格納し、バケット（Ｄ１）のデータ数を１に更新する。
【００８８】
続いて、受信部１６が、「２、Ｂｏｂ、５５、４５０、２５００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済み「Ａｌｉｃｅ」の年収「３００」と受信した「Ｂｏｂ」の年収「１５００」を比較し、当該「Ｂｏｂ」のデータの格納位置を受信済みＤＢ１２ａの先頭と特定する。そして、格納制御部１８は、当該「Ｂｏｂ」のデータを受信済みＤＢ１２ａの先頭に格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図２０は、具体的な分割例を説明する図である。図２０に示すように、更新部２０は、先頭のバケットであるバケット（Ｄ１）の先頭情報に「Ｂｏｂ」のデータを特定する「時刻２」を格納し、バケット（Ｄ１）のデータ数を２に更新する。
【００８９】
ここで、バケット判定部１９は、分割境界ＤＢ１２ｂの各分割境界を参照し、バケット（Ｄ１）のデータ数が他のバケットのデータ数よりも２以上多く、バケット（Ｄ１）が大バケットであることを特定して、これらを更新部２０に通知する。すると、更新部２０は、新たなデータが挿入された位置が受信済みＤＢ１２ａの先頭であり、先頭であるバケット（Ｄ１）が大バケットであることから、「処理６」を実行する。
【００９０】
すなわち、図２０に示すように、更新部２０は、バケット（Ｄ１）に一番近い小バケットがバケット（Ｄ２）であると特定する。つまり、ｑ＝２となる。そして、縮退実行部２０ｂは、ｕｐｓｈｒｉｎｋ（１）を実行し、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ１）の先頭情報および末尾情報を「Ｂｏｂ」のデータを特定する「時刻２」に修正し、データ数を１減らして１にする。また、拡張実行部２０ａは、分割境界ＤＢ１２ｂにおいて、バケット（Ｄ２）の先頭情報を、仮想の末端データとみなされるＮＵＬＬに対して１件上の「Ａｌｉｃｅ」の「時刻１」に置き換えて、データ数を１増やす。サイズ１のバケットに関する仮定により、バケット（Ｄ２）の末尾情報も「時刻１」に置き換える。このとき、２＞ｑ−１となるため、更新部２０は、ｕｐｓｌｉｄｅ（２、ｑ−１）を実行しない。
【００９１】
続いて、受信部１６が、「３、Ｃａｒｅｎ、６２、２００、３０００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済み各データの年収と受信した「Ｃａｒｅｎ」の年収「２００」を比較し、当該「Ｃａｒｅｎ」のデータの格納位置を受信済みＤＢ１２ａの末尾と特定する。そして、格納制御部１８は、当該「Ｃａｒｅｎ」のデータを受信済みＤＢ１２ａの末尾に格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図２１は、具体的な分割例を説明する図である。図２１に示すように、バケット判定部１９は、「Ｃａｒｅｎ」のデータの格納位置が末尾であり、格納対象の末尾のバケットが小バケットであると判定する。この結果、更新部２０は、「処理８」を実行する。すなわち、更新部２０は、分割境界ＤＢ１２ｂにおいて、末尾バケット（Ｄ３）の末尾情報に「Ｃａｒｅｎ」のデータを特定する「時刻３」を格納して、データ数を１増やす。サイズ１のバケットに関する仮定により、バケット（Ｄ３）の先頭情報にも「時刻３」を格納する。
【００９２】
続いて、受信部１６が、「４、Ｄｉｃｋ、５３、１０００、５５００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済み各データの年収と受信した「Ｄｉｃｋ」の年収「１０００」を比較し、当該「Ｄｉｃｋ」のデータの格納位置を受信済みＤＢ１２ａの先頭と特定する。そして、格納制御部１８は、当該「Ｄｉｃｋ」のデータを受信済みＤＢ１２ａの先頭に格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図２２は、具体的な分割例を説明する図である。図２２に示すように、バケット判定部１９は、「Ｄｉｃｋ」のデータの格納位置が先頭であり、格納対象の先頭のバケットが小バケットであると判定する。この結果、更新部２０は、「処理７」を実行する。すなわち、更新部２０は、分割境界ＤＢ１２ｂにおいて、先頭バケット（Ｄ１）の先頭情報に「Ｄｉｃｋ」のデータを特定する「時刻４」を格納して、データ数を１増やして「２」にする。
【００９３】
続いて、受信部１６が、「５、Ｅｒｉｋ、３５、８００、１００００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済みの各データの年収と受信した「Ｅｒｉｋ」の年収「８００」を比較し、当該「Ｅｒｉｋ」のデータの格納位置を「Ｄｉｃｋ」と「Ｂｏｂ」の間と特定する。そして、格納制御部１８は、受信済みＤＢ１２ａにおける「Ｄｉｃｋ」と「Ｂｏｂ」の間に「Ｅｒｉｋ」のデータを格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図２３は、具体的な分割例を説明する図である。図２３に示すように、更新部２０は、先頭のバケットであるバケット（Ｄ１）にデータが追加されたので、バケット（Ｄ１）のデータ数を「３」に更新する。
【００９４】
ここで、バケット判定部１９は、分割境界ＤＢ１２ｂの各分割境界を参照し、バケット（Ｄ１）のデータ数が他のバケットのデータ数よりも２以上となっていることと、バケット（Ｄ１）が大バケットであることを特定して、更新部２０に通知する。すると、更新部２０は、新たなデータがバケット（Ｄ１）の内部に格納され、バケット（Ｄ１）が大バケットであることから、「処理２」を実行する。
【００９５】
すなわち、図２３に示すように、更新部２０は、バケット（Ｄ１）に一番近い小バケットがバケット（Ｄ２）であると特定する。つまり、ｑ＝２となり、ｐ＜ｑとなる。したがって、縮退実行部２０ｂは、ｕｐｓｈｒｉｎｋ（１）を実行し、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ１）の末尾情報を「Ｄｉｃｋ」のデータを特定する「時刻５」に修正してデータ数を１減らして「１」にする。また、拡張実行部２０ａは、ｕｐｅｘｐａｎｄ（２）を実行し、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ２）の先頭情報を１件上の「Ｂｏｂ」の「時刻２」に置き換えて、データ数を１増やして「２」にする。このとき、ｐ＋１＞ｑ−１となるため、更新部２０は、ｕｐｓｌｉｄｅ（ｐ＋１、ｑ−１）を実行しない。
【００９６】
続いて、受信部１６が、「６、Ｆｒａｎｋｌｉｎ、１９、２５０、３００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済みの各データの年収と受信した「Ｅｒｉｋ」の年収「２５０」を比較し、当該「Ｆｒａｎｋｌｉｎ」のデータの格納位置を「Ａｌｉｃｅ」と「Ｃａｒｅｎ」の間と特定する。そして、格納制御部１８は、受信済みＤＢ１２ａにおける「Ａｌｉｃｅ」と「Ｃａｒｅｎ」の間に「Ｆｒａｎｋｌｉｎ」のデータを格納する。
【００９７】
ここで、バケット判定部１９は、受信済みＤＢ１２ａや分割境界ＤＢ１２ｂを参照し、「Ｆｒａｎｋｌｉｎ」のデータの格納位置がバケット（Ｄ２）とバケット（Ｄ３）の間であり、バケット（Ｄ２）が大バケットで、バケット（Ｄ３）が小バケットであると判定する。この判定を受けて、更新部２０は、「処理５」を実行する。図２４は、具体的な分割例を説明する図である。図２４に示すように、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ３）の先頭情報を「Ｆｒａｎｋｌｉｎ」のデータを特定する「時刻６」に修正し、データ数を１増やして「２」に更新する。
【００９８】
続いて、受信部１６が、「７、Ｇｅｏｒｇｅ、２５、６００、１３００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済みの各データの年収と受信した「Ｇｅｏｒｇｅ」の年収「６００」を比較し、当該「Ｇｅｏｒｇｅ」のデータの格納位置を「Ｅｒｉｋ」と「Ｂｏｂ」の間と特定する。そして、格納制御部１８は、受信済みＤＢ１２ａにおける「Ｅｒｉｋ」と「Ｂｏｂ」の間に「Ｇｅｏｒｇｅ」のデータを格納する。
【００９９】
ここで、バケット判定部１９は、受信済みＤＢ１２ａや分割境界ＤＢ１２ｂを参照し、「Ｇｅｏｒｇｅ」のデータの格納位置がバケット（Ｄ１）とバケット（Ｄ２）の間であり、バケット（Ｄ１）とバケット（Ｄ２）とが共に小バケットであると判定する。この判定を受けて、更新部２０は、「処理３」を実行する。図２５は、具体的な分割例を説明する図である。図２５に示すように、更新部２０は、分割境界ＤＢ１２ｂに記憶されるバケットＤ１の末尾情報を「Ｇｅｏｒｇｅ」のデータを特定する「時刻７」に修正し、データ数を１増やして「３」に更新する。
【０１００】
続いて、受信部１６が、「８、Ｈｅｎｒｙ、４７、７５０、８５００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済みの各データの年収と受信した「Ｈｅｎｒｙ」の年収「７５０」を比較し、当該「Ｈｅｎｒｙ」のデータの格納位置を「Ｅｒｉｋ」と「Ｇｅｏｒｇｅ」の間と特定する。そして、格納制御部１８は、受信済みＤＢ１２ａにおける「Ｅｒｉｋ」と「Ｇｅｏｒｇｅ」の間に「Ｈｅｎｒｙ」のデータを格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図２６は、具体的な分割例を説明する図である。図２６に示すように、更新部２０は、先頭のバケットであるバケットＤ１にデータが追加されたので、バケットＤ１のデータ数を４に更新する。
【０１０１】
ここで、バケット判定部１９は、分割境界ＤＢ１２ｂの各分割境界を参照し、バケット（Ｄ１）のデータ数が他のバケットのデータ数よりも２以上となっていることと、バケット（Ｄ１）が大バケットであることを特定して、更新部２０に通知する。すると、更新部２０は、新たなデータがバケット（Ｄ１）の内部に格納され、バケット（Ｄ１）が大バケットであることから、「処理２」を実行する。
【０１０２】
すなわち、図２６に示すように、更新部２０は、バケット（Ｄ１）に一番近い小バケットがバケット（Ｄ２）であると特定する。つまり、ｑ＝２となり、ｐ＜ｑとなる。したがって、縮退実行部２０ｂは、ｕｐｓｈｒｉｎｋ（１）を実行し、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ１）の末尾情報を「時刻７」から「Ｈｅｎｒｙ」のデータを特定する「時刻８」に修正してデータ数を１減らして「３」にする。また、拡張実行部２０ａは、ｕｐｅｘｐａｎｄ（２）を実行し、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ２）の先頭情報を「時刻２」から１件上の「Ｇｅｏｒｇｅ」の「時刻７」に置き換えて、データ数を１増やして「３」にする。このとき、ｐ＋１＞ｑ−１となるため、更新部２０は、ｕｐｓｌｉｄｅ（ｐ＋１、ｑ−１）を実行しない。
【０１０３】
続いて、受信部１６が、「９、Ｉｒｉｓ、６１、１２００、７０００」とするストリームデータを受信したとする。すると、位置特定部１７は、格納済みの各データの年収と受信した「Ｉｒｉｓ」の年収「１２００」を比較し、当該「Ｉｒｉｓ」のデータの格納位置を受信済みＤＢ１２ａの先頭と特定する。そして、格納制御部１８は、「Ｉｒｉｓ」のデータを受信済みＤＢ１２ａの先頭に格納する。その後、更新部２０は、分割境界ＤＢ１２ｂを更新する。図２７は、具体的な分割例を説明する図である。図２７に示すように、更新部２０は、先頭のバケットであるバケット（Ｄ１）の先頭情報に「Ｉｒｉｓ」のデータを特定する「時刻９」を格納し、バケット（Ｄ１）のデータ数を４に更新する。
【０１０４】
ここで、バケット判定部１９は、分割境界ＤＢ１２ｂの各分割境界を参照し、バケットＤ１のデータ数が他のバケットのデータ数よりも２以上多く、バケット（Ｄ１）が大バケットであることを特定して、更新部２０に通知する。すると、更新部２０は、新たなデータが挿入された位置が受信済みＤＢ１２ａの先頭であり、先頭であるバケット（Ｄ１）が大バケットであることから、「処理６」を実行する。
【０１０５】
すなわち、図２７に示すように、更新部は、バケット（Ｄ１）に一番近い小バケットがバケット（Ｄ２）であると特定する。つまり、ｑ＝２となる。そして、縮退実行部２０ｂは、ｕｐｓｈｒｉｎｋ（１）を実行し、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ１）の末尾情報を「時刻８」から１件上の「時刻５」に修正し、データ数を１減らして「３」にする。また、スライド実行部２０ｃは、ｕｐｓｌｉｄｅ（２、２）を実行し、バケット（Ｄ２）の先頭情報を「時刻７」から１件上の「時刻８」に修正し、バケット（Ｄ２）の末尾情報を「時刻１」から１件上の「時刻２」に修正する。さらに、拡張実行部２０ａは、ｕｐｅｘｐａｎｄ（３）を実行して、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ３）の先頭情報を「時刻６」から１件上の「時刻１」に置き換えて、データ数を１増やして「３」にする。
【０１０６】
上述した図１９から図２７を実行することで、データ分割装置１０は、図２８に示す分割結果を得ることができる。図２８は、具体的な分割例による処理結果を示す図である。図２８に示すように、データ分割装置１０は、時刻１から時刻９までのデータを順次受信し、受信するたびにソートしながら蓄積する一方で、受信済みデータを均等分割することができる。図２８の例では、データ分割装置１０が、時刻９、時刻４、時刻５のデータをバケットＤ１に分割し、時刻８、時刻７、時刻２のデータをバケットＤ２に分割し、時刻１、時刻６、時刻３のデータをバケットＤ３に分割した状態を示す。
【０１０７】
［出力の具体例］
次に、図２９から図３２を用いて、データ出力の具体例を説明する。図２９は、データ分割装置がデータ分割を実行した結果を示す図である。図２９に示すように、データ分割装置１０が、時刻１から時刻１０までのデータを５つのバケットに均等分割したとする。具体的には、データ分割装置１０は、時刻９と時刻４のデータをバケット（Ｄ１）に分割し、時刻５と時刻８のデータをバケット（Ｄ２）に分割し、時刻７と時刻２のデータをバケット（Ｄ３）に分割したとする。同様に、データ分割装置１０は、時刻１０と時刻１のデータをバケット（Ｄ４）に分割し、時刻６と時刻３のデータをバケット（Ｄ５）に分割したとする。
【０１０８】
この状態において、データ分割装置１０の出力部２１は、ユーザ端末５からバケット（Ｄ２）とバケット（Ｄ３）とバケット（Ｄ４）のデータ出力依頼を受信したとする。図３０から図３２は、具体的なデータ出力例を説明する図である。この場合、まず、出力部２１は、図３０に示すように、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ２）の先頭および末尾情報を参照する。そして、出力部２１は、受信済みＤＢ１２ａにソートされて記憶されるデータのうち「時刻５」から「時刻８」までの間に位置する２つのデータがバケット（Ｄ２）に属するデータであると特定する。そして、出力部２１は、「時刻５」のレコードである「５、Ｅｒｉｋ、３５、８００、１００００」と「時刻８」のレコードである「８、Ｈｅｎｒｙ、４７、７５０、８５００」とを受信済みＤＢ１２ａから読み出して、ユーザ端末５に送信する。
【０１０９】
次に、出力部２１は、図３１に示すように、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ３）の先頭および末尾情報を参照する。そして、出力部２１は、受信済みＤＢ１２ａにソートされて記憶されるデータのうち「時刻７」から「時刻２」までの間に位置する２つのデータがバケット（Ｄ３）に属するデータであると特定する。そして、出力部２１は、「時刻７」のレコードである「７、Ｇｅｏｒｇｅ、２５、６００、１３００」と「時刻２」のレコードである「２、Ｂｏｂ、５５、４５０、２５００」とを受信済みＤＢ１２ａから読み出して、ユーザ端末５に送信する。
【０１１０】
最後に、出力部２１は、図３２に示すように、分割境界ＤＢ１２ｂに記憶されるバケット（Ｄ４）の先頭および末尾情報を参照する。そして、出力部２１は、受信済みＤＢ１２ａにソートされて記憶されるデータのうち「時刻１０」から「時刻１」までの間に位置する２つのデータがバケット（Ｄ４）に属するデータであると特定する。そして、出力部２１は、「時刻１０」のレコードである「１０、Ｊａｍｅｓ、３７、４００、１７００」と「時刻１」のレコードである「１、Ａｌｉｃｅ、２４、３００、１５００」とを受信済みＤＢ１２ａから読み出して、ユーザ端末５に送信する。
【０１１１】
このように、データ分割装置１０は、データ分割結果のうちユーザが指定するグループのデータを読み出して応答することができる。
【０１１２】
［実施例による効果］
このように、実施例１に係るデータ分割装置１０は、バケット数を固定したまま１レコードごとに動的に分割境界を変更するような整列均等分割を実現することができる。つまり、データ分割装置１０は、ストリームデータを受信するたびにデータをソートして格納するとともに、データ分割を行うことができる。このとき、データ分割装置１０は、ソートした順序を示す連番をデータに割り振ることなく、グループ分けすることができるので、データの分割にかかる時間を短縮できる。つまり、実施例で示す「時刻」のように、レコードを識別する番号を示す「通番」は与えられているが、「連番」が与えられていないデータを、「連番」を与えることなく高速に分割することができる。
【０１１３】
データ分割装置１０では、データ受信時にデータを分割することができるので、ユーザがデータ分割を要求してから分割するまでに時間がかからず、即時応答することができる。一方、従来技術の場合、均等分割された結果に対して、一部のバケットのみの出力が要求されるような場合には、全データをスキャンしなければならないので、時間がかかる。一方、実施例１に係るデータ分割装置１０は、ユーザが要求するバケット内のデータのみスキャンすればよいので、出力時間を短縮できる。
【実施例２】
【０１１４】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【０１１５】
（分割と出力）
実施例１では、データ分割とデータ出力とを１つのフローチャートで説明したが、これに限定されるものではない。例えば、データ分割とデータ出力とは全く別の契機で実行させることもできる。つまり、データ分割処理した後にデータ出力処理を実行するのではなく、全く別の処理として実行することができる。また、データ分割装置１０は、ユーザ端末５にデータを出力するだけでなく、例えばディスプレイなどの表示部に表示させることもでき、記憶媒体等に書き込むこともできる。
【０１１６】
（ストリームデータ）
実施例１で説明したストリームデータやデータの構成はあくまで例であり、これに限定するものではない。また、データ分割装置１０は、ストリームデータに限ったものではなく、様々なデータに適用することができる。例えば、データ分割装置１０は、ストレージ等に格納されるデータや、記憶媒体等から読み出されたデータに対しても同様に分割することができる。
【０１１７】
（システム）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【０１１８】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られない。つまり、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【０１１９】
（ハードウェア構成）
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータシステムの一例を説明する。
【０１２０】
図３３は、データ分割プログラムを実行するコンピュータのハードウェア構成の例を示す図である。図３３に示すように、コンピュータ１００は、ＣＰＵ１０２、入力装置１０３、出力装置１０４、通信インタフェース１０５、媒体読取装置１０６、ＨＤＤ（Hard  Disk  Drive）１０７、ＲＡＭ（Random  Access  Memory）１０８を有する。また、図３３に示した各部は、バス１０１で相互に接続される。
【０１２１】
入力装置１０３は、マウスやキーボードであり、出力装置１０４は、ディスプレイなどであり、通信インタフェース１０５は、ＮＩＣ（Network  Interface  Card）などのインタフェースである。ＨＤＤ１０７は、データ分割プログラム１０７ａとともに、図２に示した各ＤＢ等を記憶する。記録媒体の例としてＨＤＤ１０７を例に挙げたが、ＲＯＭ（Read  Only  Memory）、ＲＡＭ、ＣＤ−ＲＯＭ、ＳＳＤ（Solid  State  Drive）等の他のコンピュータ読取可能な記録媒体に各種プログラムを格納しておき、コンピュータに読み取らせることとしてもよい。なお、記録媒体を遠隔地に配置し、コンピュータが、その記憶媒体にアクセスすることでプログラムを取得して利用してもよい。また、その際、取得したプログラムをそのコンピュータ自身の記録媒体に格納して用いてもよい。
【０１２２】
ＣＰＵ１０２は、データ分割プログラム１０７ａを読み出してＲＡＭ１０８に展開することで、図２等で説明した各機能を実行するデータ分割プロセス１０８ａを動作させる。すなわち、データ分割プロセス１０８ａは、図２に記載した分割数設定部１４、分割処理部１５、出力部２１と同様の機能を実行する。このようにコンピュータ１００は、プログラムを読み出して実行することでデータ分割方法を実行する情報処理装置として動作する。
【０１２３】
例えば、コンピュータ１００は、媒体読取装置１０６によって記録媒体からデータ分割プログラムを読み出し、読み出されたデータ分割プログラムを実行することで上記した実施例と同様の機能を実現することもできる。なお、この他の実施例でいうプログラムは、コンピュータ１００によって実行されることに限定されるものではない。例えば、他のコンピュータまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【符号の説明】
【０１２４】
１  ストリームデータ発生装置
５  ユーザ端末
１０  データ分割装置
１１  通信制御Ｉ／Ｆ部
１２  記憶部
１２ａ  受信済みＤＢ
１２ｂ  分割境界ＤＢ
１３  制御部
１４  分割数設定部
１５  分割処理部
１６  受信部
１７  位置特定部
１８  格納制御部
１９  バケット判定部
２０  更新部
２０ａ  拡張実行部
２０ｂ  縮退実行部
２０ｃ  スライド実行部
２１  出力部
【図１】
0005712851.tif 000002
【図２】
0005712851.tif 000003
【図３】
0005712851.tif 000004
【図４】
0005712851.tif 000005
【図５】
0005712851.tif 000006
【図６】
0005712851.tif 000007
【図７】
0005712851.tif 000008
【図８】
0005712851.tif 000009
【図９】
0005712851.tif 000010
【図１０】
0005712851.tif 000011
【図１１】
0005712851.tif 000012
【図１２】
0005712851.tif 000013
【図１３】
0005712851.tif 000014
【図１４】
0005712851.tif 000015
【図１５】
0005712851.tif 000016
【図１６】
0005712851.tif 000017
【図１７】
0005712851.tif 000018
【図１８】
0005712851.tif 000019
【図１９】
0005712851.tif 000020
【図２０】
0005712851.tif 000021
【図２１】
0005712851.tif 000022
【図２２】
0005712851.tif 000023
【図２３】
0005712851.tif 000024
【図２４】
0005712851.tif 000025
【図２５】
0005712851.tif 000026
【図２６】
0005712851.tif 000027
【図２７】
0005712851.tif 000028
【図２８】
0005712851.tif 000029
【図２９】
0005712851.tif 000030
【図３０】
0005712851.tif 000031
【図３１】
0005712851.tif 000032
【図３２】
0005712851.tif 000033
【図３３】
0005712851.tif 000034