JP2013011946A - データ蓄積装置、データ蓄積方法、及びプログラム - Google Patents

データ蓄積装置、データ蓄積方法、及びプログラム Download PDF

Info

Publication number
JP2013011946A
JP2013011946A JP2011142884A JP2011142884A JP2013011946A JP 2013011946 A JP2013011946 A JP 2013011946A JP 2011142884 A JP2011142884 A JP 2011142884A JP 2011142884 A JP2011142884 A JP 2011142884A JP 2013011946 A JP2013011946 A JP 2013011946A
Authority
JP
Japan
Prior art keywords
offset
data
bit
compression
bits
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2011142884A
Other languages
English (en)
Other versions
JP5639011B2 (ja
Inventor
Takahiro Yamazaki
敬広 山崎
Hiroshi Sato
浩史 佐藤
Takeshi Inoue
武 井上
Junichiro Takagi
潤一郎 高木
Shunsuke Saruwatari
俊介 猿渡
Hiroyuki Morikawa
博之 森川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nippon Telegraph and Telephone Corp
Original Assignee
Nippon Telegraph and Telephone Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nippon Telegraph and Telephone Corp filed Critical Nippon Telegraph and Telephone Corp
Priority to JP2011142884A priority Critical patent/JP5639011B2/ja
Publication of JP2013011946A publication Critical patent/JP2013011946A/ja
Application granted granted Critical
Publication of JP5639011B2 publication Critical patent/JP5639011B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

【課題】データを二次記憶装置へ蓄積する際に、キー値についてデータの順序がある程度逆転して入力されたとしても逐次書き込みファイルに近い速度を維持することが可能、キー値による完全一致検索が可能、範囲検索による効率的なデータの読み込みが可能、且つ突発的な大きな遅延によりデータ順序が大きく逆転したとしても、これを空間効率良く表現可能なデータ構造を実現できるデータ蓄積装置、データ蓄積方法、及びプログラムを提供する。
【解決手段】レコードの特定の値をキー値としてsparse indexによる索引付けを行い、一の論理ブロックが受け持つキー値の範囲に含まれるキー値のレコードが他の論理ブロックにある場合には、一の論理ブロックから別の論理ブロックへのオフセット数をビット列で表現して圧縮したオフセットデータをオフセットファイルとして二次記憶装置330に記録させる。
【選択図】図1

Description

本発明は、二次記憶装置へデータを蓄積するデータ蓄積装置、データ蓄積方法、及びそのプログラムに関するものである。
二次記憶装置へのデータ蓄積方法では、レコードといういくつかの情報を1つにまとめたデータを、データを格納する際の最小単位として扱っている。また、二次記憶装置への最小アクセス単位として物理ブロックがあり、これをシステム上で仮想的に扱えるようにしたものを論理ブロックと呼ぶ。ファイルは複数の論理ブロックから成り立ち、論理ブロックは複数のレコードを含むことが多い。
また、特定のレコードを効率的に検索するために、索引が用いられている。索引はレコードが持つ任意の属性の値について作成することができる。このときこの索引を作成する任意の属性の値のことをキー値と呼ぶ。この索引付け方法のうち、範囲検索を行える方法として、デンスインデックス(dense index)とスパースインデックス(sparse index)がある(例えば、非特許文献1を参照。)。dense indexはデータの入力順に左右されず、入力された全てのレコードについて索引を作成する。これに対しsparse indexではデータの入力順を利用して、入力されたレコードのうち一部のレコードについてのみ索引を作成する。索引が作成されないレコードに関しては、入力順がキー値についてソートされているという前提の元で探索を行う。このため、sparse indexはデータの入力順がキー値についてソートされているときに限り使うことのできる方法である。
一方、センサネットワークを通じて集められる大量の時系列センサデータなどを時刻をキー値として範囲検索可能な形でリアルタイムに二次記憶装置へ蓄積しようとする場合、データ書き込みの高速性が求められる。従来の索引付け方法のうちdense indexを用いる場合、入力される各レコードに索引を作成する必要があるため、データ書き込み時のコストがsparse indexに比べて高く、データ書き込み速度がデータの発生に追いつかない恐れがある。一方で、sparse indexを用いるためには入力されるデータがキー値(この場合、時刻)についてソートされた状態で入力される必要がある。しかし、センサネットワークを通じて集められる大量の時系列データはネットワークの遅延やセンサ等データソース側の接続断などによって、時刻データの入力順が時刻のとおりに一定ではなく、順序逆転することが考えられる。このため、時刻をキー値とすると、キー値によっておおよそ整列しているが、部分的に遅延による順序逆転が起きているデータとなるためsparse indexを用いることができない。
この問題に対して、sparse index に、新たなオフセットデータというビットマップで順序逆転したデータの格納位置を表すデータを加え、データの順序逆転に対応する方法が提案されている(例えば、非特許文献2参照。)。本方法では、ビットマップを用い、オフセット数に対応したビット番号のビットを1にすることで、オフセット数を表現することで、遅延データの位置を指し示し、高速な索引付けと順序逆転データへの対応を両立している。
Abraham Silberschatz, Henry F.Korth, S.Sudarshan,"Database System Concepts Fifth Edition", pp.483−485, McGraw−Hill(2006). T.Yamazaki, T.Inoue, H.Sato, N.Takahashi, J.Takagi, M.Minami,"Efficiently indexing with offset bitmaps for huge sets of slightly disordered sensor data", APSITT2010, 2010. H.Williams and J.Zobel,"Compressing integers for fast file access", Computer Journal, 42(3):193−201,1999. Vo Ngoc Anh, Alistair Moffat:"Inverted Index Compression using Word−Aligned Binary Codes", Information Retrieval, 8(1):151−166,2005.
従来のデータの順序逆転に高速に対応する方法では、ビットマップを用い、オフセット数に対応したビット番号のビットを1にすることで、オフセット数を表現する方法をとっている。しかし、この場合、連続して発生する小さな遅延を効率的に表現することは可能だが、センサ等データソース側の接続断などにより発生する突発的な大きな遅延に対しては、そのオフセット数と同じ数のビット数という多くのビット数が必要となり、空間効率が悪いという課題があった。
そこで、前記課題を解決するために、本発明は、データを二次記憶装置へ蓄積する際に、キー値についてデータの順序がある程度逆転して入力されたとしても逐次書き込みファイルに近い速度を維持することが可能、キー値による完全一致検索が可能、範囲検索による効率的なデータの読み込みが可能、且つ突発的な大きな遅延によりデータ順序が大きく逆転したとしても、これを空間効率良く表現可能なデータ構造を実現できるデータ蓄積装置、データ蓄積方法、及びプログラムを提供することを目的とする。
上記課題の解決のため、本発明は、レコードの特定の値をキー値としてsparse indexによる索引付けを行い、一の論理ブロックが受け持つキー値の範囲に含まれるキー値のレコードが他の論理ブロックにある場合には、一の論理ブロックから別の論理ブロックへのオフセット数をビット列で表現して圧縮したオフセットデータをオフセットファイルとして二次記憶装置に記録させることとした。
具体的には、本発明に係るデータ蓄積装置は、レコードを最小単位として連続して入力されるデータを、論理ブロックを単位として逐次蓄積する二次記憶装置と、前記レコードの特定の値をキー値としてスパースインデックス(sparse index)による索引付けを行い、一の論理ブロックが受け持つキー値の範囲に含まれる前記キー値を持つ前記レコードが他の論理ブロックにある場合には、前記一の論理ブロックから前記他の論理ブロックへのオフセット数をビット列で表現して圧縮したオフセットデータをオフセットファイルとして前記二次記憶装置に記録させるシステム制御手段と、を備える。
具体的には、本発明に係るデータ蓄積方法は、レコードを最小単位として連続して入力されるデータを、論理ブロックを単位として二次記憶装置に逐次蓄積する際に、前記レコードの特定の値をキー値としてスパースインデックス(sparse index)による索引付けを行い、一の論理ブロックが受け持つキー値の範囲に含まれる前記キー値を持つ前記レコードが他の論理ブロックにある場合には、前記一の論理ブロックから前記他の論理ブロックへのオフセット数をビット列で表現して圧縮したオフセットデータをオフセットファイルとして前記二次記憶装置に記録させるシステム制御手順を行う。
本発明に係るデータ蓄積装置及びデータ蓄積方法は、sparse indexとオフセットデータを組み合わせているため、順序逆転したデータに対して検索可能となる。さらに、オフセットデータを圧縮することでネットワークの接続断による突発的な大きな遅延をより効率的に表現できる。
従って、本発明は、データを二次記憶装置へ蓄積する際に、キー値についてデータの順序がある程度逆転して入力されたとしても逐次書き込みファイルに近い速度を維持することが可能、キー値による完全一致検索が可能、範囲検索による効率的なデータの読み込みが可能、且つ突発的な大きな遅延によりデータ順序が大きく逆転したとしても、これを空間効率良く表現可能なデータ構造を実現できるデータ蓄積装置及びデータ蓄積方法を提供することができる。
オフセットデータの圧縮には、以下の3つの手法がある。
(1)Run Length圧縮
Run Length圧縮は、ある値が一定以上の個数連続して現れた場合に、これをそのまま表現する代わりに、連続したビットの個数を表して圧縮する手法である。
本データ蓄積装置の前記システム制御手段は、前記オフセットデータを、コード長記憶部、圧縮回数記憶部、圧縮位置及び圧縮ビット数記憶部、並びにコード部で構成し、前記コード部において、前記オフセット数と等しいビット位置のビットを「1」とし、前記コード部のビット列が予め設定したしきい値以上同一のビットが連続する連続ビット部を含む場合に、前記連続ビット部のビット数を数え上げ、前記連続ビット部の先頭の位置と前記連続ビット部のビット数を前記圧縮位置及び圧縮ビット数記憶部に記録し、前記連続ビット部の先頭のビットを残して前記連続ビット部の他のビットを削除するオフセット圧縮部を有することを特徴とする。
本データ蓄積方法の前記システム制御手順は、前記オフセットデータを、コード長記憶部、圧縮回数記憶部、圧縮位置及び圧縮ビット数記憶部、並びにコード部で構成し、前記コード部において、前記オフセット数と等しいビット位置のビットを「1」とし、前記コード部のビット列が予め設定したしきい値以上同一のビットが連続する連続ビット部を含む場合に、前記連続ビット部のビット数を数え上げ、前記連続ビット部の先頭の位置と前記連続ビット部のビット数を前記圧縮位置及び圧縮ビット数記憶部に記録し、前記連続ビット部の先頭のビットを残して前記連続ビット部の他のビットを削除することを特徴とする。
本圧縮方法では、ビットマップを用いたオフセット表現方法へ応用するに際して、オフセットデータの構造として、コード長記憶部、圧縮回数記憶部、圧縮位置および圧縮ビット数記憶部、並びにコード部を用意する。
このとき、コード部では、前記提案方法と同様にビットマップを用いて、オフセット数と等しいビット番号のビットを1にすることで、オフセット数を表現するが、0もしくは1のビットが、あらかじめ定めた一定数以上連続する場合、これをRun Length圧縮する。このとき、圧縮に際して、圧縮したビットの位置および連続したビットの個数を表現する必要があるが、これを圧縮位置および圧縮ビット数記憶部に格納する。この圧縮位置および圧縮ビット数記憶部は、Run Length圧縮を行った回数分の個数だけ、都度準備する。この圧縮を行った回数は、圧縮回数記憶部に記憶する。また、コード部に格納されたビットマップのサイズをコード長記憶部に格納する。
本データ構造を用いることで、ビットマップによる表現を行いつつも、Run Length圧縮可能な場合はこれを行うことにより、より効率的なオフセット表現が可能となる。また、圧縮位置および圧縮ビット数部分をコード部と分離させているため、新たなオフセットの追加が、コード部を参照して全てのオフセットをデコードすることなく行え、効率的なオフセット追加処理が可能となる。
(2)Simple9
4バイト(32ビット)を1つの符号として扱い、1つの符号に、できるだけ多くの整数値を詰め込もうとする方法で、整数値の大きさに合わせて、使用するビット数を1〜28ビットに変化させる手法である(例えば、非特許文献4を参照。)。
本データ蓄積装置の前記システム制御手段は、一の論理ブロックが受け持つ前記キー値の範囲に含まれる前記キー値を持つ前記レコードが他の複数の論理ブロックにある場合、前記一の論理ブロックから前記他の複数の論理ブロックへの前記オフセット数をそれぞれ求め、前記他の複数の論理ブロックのうち最もブロック位置が近い論理ブロック同士について、求めた前記オフセット数からそれぞれの論理ブロックへのオフセット数の差を求め、これを差分オフセット数とし、前記オフセットデータを、ヘッダ部並びにコード部で構成し、前記コード部に、単数の前記オフセット数もしくは複数の前記差分オフセット数を前記オフセット数もしくは前記差分オフセット数に応じたビット数で表現したオフセットビット列、及び前記オフセットビット列のビット数を記載した一定ビット数の符号ヘッダ、で形成される符号を格納し、前記ヘッダ部に、前記符号の個数及び前記オフセット数の個数を表示するオフセット圧縮部を有することを特徴とする。
本データ蓄積方法の前記システム制御手順は、一の論理ブロックが受け持つ前記キー値の範囲に含まれる前記キー値を持つ前記レコードが他の複数の論理ブロックにある場合、前記一の論理ブロックから前記他の複数の論理ブロックへの前記オフセット数をそれぞれ求め、前記他の複数の論理ブロックのうち最もブロック位置が近い論理ブロック同士について、求めた前記オフセット数からそれぞれの論理ブロックへのオフセット数の差を求め、これを差分オフセット数とし、前記オフセットデータを、ヘッダ部並びにコード部で構成し、前記コード部に、単数の前記オフセット数もしくは複数の前記差分オフセット数を前記オフセット数もしくは前記差分オフセット数に応じたビット数で表現したオフセットビット列、及び前記オフセットビット列のビット数を記載した一定ビット数の符号ヘッダ、で形成される符号を格納し、前記ヘッダ部に、前記符号の個数及び前記オフセット数の個数を表示することを特徴とする。
本圧縮方法をオフセットデータへ応用するに際して、オフセットデータの構造として、ヘッダ部とコード部を用意する。このとき、コード部はSimple9で圧縮された整数値列を格納し、ヘッダ部はSimple9で圧縮された整数値の個数とSimple9の符号の個数とを格納する。本データ構造を用いることで、Simple9の符号の伸長時に、このヘッダ部のデータを用いることで余分なデータの処理が抑えられ、効率的な処理が可能となる。
(3)Variable Byte Code
通常4バイトで表す整数値を、整数値の大きさに合わせて使用するバイト数を1〜4バイトに変化させる方法である(例えば、非特許文献3を参照。)。
本データ蓄積装置の前記システム制御手段は、前記オフセットデータを複数のバイトで構成し、前記オフセット数に応じたバイト数で前記オフセット数を表現する際に、前記オフセット数を表現する各バイトの一定数のビットをヘッダとし、前記オフセット数を表現したバイト数を前記ヘッダで表示するオフセット圧縮部を有することを特徴とする。
本データ蓄積方法の前記システム制御手順は、前記オフセットデータを複数のバイトで構成し、前記オフセット数に応じたバイト数で前記オフセット数を表現する際に、前記オフセット数を表現する各バイトの一定数のビットをヘッダとし、前記オフセット数を表現したバイト数を前記ヘッダで表示することを特徴とする。
また、本発明に係るプログラムは、コンピュータに、前記データ蓄積方法の前記システム制御手順を実行させる。
本発明は、データを二次記憶装置へ蓄積する際に、キー値についてデータの順序がある程度逆転して入力されたとしても逐次書き込みファイルに近い速度を維持することが可能、キー値による完全一致検索が可能、範囲検索による効率的なデータの読み込みが可能、且つ突発的な大きな遅延によりデータ順序が大きく逆転したとしても、これを空間効率良く表現可能なデータ構造を実現できるデータ蓄積装置、データ蓄積方法、及びプログラムを提供することができる。
本発明に係るデータ蓄積装置の構成を説明する図である。 本発明に係るデータ蓄積装置のデータ構造を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置のデータ構造を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置のデータ構造を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の動作を説明する図である。 本発明に係るデータ蓄積装置の効果を説明する図である。 本発明に係るデータ蓄積装置の効果を説明する図である。 本発明に係るデータ蓄積装置の効果を説明する図である。 本発明に係るデータ蓄積装置の効果を説明する図である。
以下、具体的に実施形態を示して本発明を詳細に説明するが、本願の発明は以下の記載に限定して解釈されない。なお、本明細書及び図面において符号が同じ構成要素は、相互に同一のものを示すものとする。
(実施形態1)
実施形態1はオフセット数の表現にVariable Byte Codeを用いる形態である。
図1は、実施形態1のデータ蓄積装置10の構成を説明する図である。データ蓄積装置10は、システム制御部300、インタフェース110、バッファメモリ120、二次記憶装置330を備える。インタフェース110はバッファメモリ120と、バッファメモリ120はインタフェース110と二次記憶装置330とそれぞれデータのやり取りを行う。システム制御部300は、インタフェース110の入力データについて、それが書き込み要求なのか読み出し要求なのかを解析する。システム制御部300は、バッファメモリ120に対して入出力データをバッファさせるためのメモリ管理を行う。システム制御部300は、二次記憶装置に対してデータ入力におけるファイルへのデータ書き込みなどのファイル操作を行う。二次記憶装置内には索引ファイル331とデータファイル332とオフセットファイル333の3つのファイルが存在する。
図2は、データ蓄積装置10のデータ構造を説明する図である。データファイル332の各論理ブロックは入力されたレコードから構成される。
オフセットファイル333における各レコードであるオフセットデータは、固定長Wビットのデータである。各オフセットデータは、ファイル上での位置を用いて、データファイルの各論理ブロックに一対一で対応している。オフセットデータは圧縮したオフセット数値列を格納するコード部のみから構成される。オフセット数値列の圧縮はVariable Byte Codeを用いて行う。
図3及び図4はデータ蓄積装置10におけるデータ追加処理を示すフローチャートである。
データ追加処理では、まず入力レコードをバッファメモリ上に蓄積する(ステップS701)。入力レコードが論理ブロックサイズ分だけ蓄積されるまで入力レコードをバッファメモリに蓄積し続ける(ステップS702)。
入力レコードがバッファメモリ内に論理ブロックサイズ分だけ蓄積されたならば、バッファメモリ内のレコードをキー値について昇順にソートする(ステップS703)。その後、バッファメモリ内のレコードを、データファイルの末尾に論理ブロック分書き込む(ステップS704)。この書き込んだ論理ブロックをB1とする。また、オフセットデータの初期値として全ビットを0にしたビット列を、オフセットファイルに書き込む(ステップS705)。
次に、索引ファイルを参照して索引ファイル内の最大のキー値を探し、その値を今書き込んだ論理ブロックであるB1が扱うキー値の下限値Lとして一時的に記憶する(ステップS706)。その後、書き込んだ論理ブロック内で最大のキー値を持つ末尾のレコードに対して索引を作成し、索引ファイルを更新する(ステップS707)。
さらに、バッファメモリ内のレコードを参照し(ステップS708)、先頭のレコードから順にレコードのキー値が下限値L以下となるレコードを探す(ステップS709)。参照したレコードが下限値Lよりも大きい場合、そこで探索を終了し、書き込み処理を終了する。参照したレコードが下限値L以下の場合、索引ファイルを調べそのキー値以上でもっとも値が小さいキー値を探す(ステップS710)。ここで、探索したキー値が指す論理ブロックであるB2がすでに更新済みであれば(ステップS711)、その論理ブロックB2の更新処理は取りやめ、バッファメモリ上で次のレコードがあれば、次のレコードを参照し、同様の処理を行う(ステップS720、ステップS721)。なければ、そこで探索終了とし、書き込み処理を終了する。探索したキー値が指す論理ブロックB2が更新済みでなければ、その論理ブロックB2を読み込む(ステップS712、ステップS713)。
次に、読み込んだ論理ブロックB2と書き込んだ論理ブロックB1とのブロック位置を比較し、論理ブロック数がいくつ離れているかを計算し、これをオフセットXとする(ステップS714)。このオフセットXと、論理ブロックB2に対応したオフセットデータを入力として(ステップS715)、「オフセットデータ更新」処理を行う(ステップS716)。本処理については後述するが、これにより、オフセットデータにオフセットXを追加して更新したオフセットデータを得ることができる。この更新したオフセットデータにより、元のオフセットデータを更新し、オフセットファイルを更新する(ステップS719)。
バッファメモリ上の次のレコードがあれば、それを参照し、同様の処理を行う(ステップS720、ステップS721)。次のレコードがなければ、データ追加処理を終了する。
図5は、図4のオフセットデータ更新処理S716を説明するフローチャートである。
オフセットデータ更新処理S716では、入力として、オフセットデータとオフセットを受け取る。例として、オフセットデータとして“10,11,12”の整数値列をVariable Byte Codeで圧縮したもの、オフセットとして129が入力されたとする。このとき、ループ(ステップS812)に入り、オフセットの129を2進数で表現するのに、どれだけのビット数が必要かのチェックを行う(ステップS813)。このとき、129は規定値の一つである128よりも大きく、16384よりも小さいため、ビット数14で表現できることがわかる。この14ビットで129を表現し(00000010000001)このビット列をPとする(ステップS815)。Pについて、先頭から順にビット7つごとに、ヘッダとして1ビットを追加し、1バイトひとまとまりで扱う。このため、Pは(00000001 00000001)となる。さらに、その1バイトが数値を表現する最下位バイトだった場合、ヘッダの1ビットを1とする(ステップS816)。このため、Pは(00000001 10000001)となる。これをオフセットデータの末尾に追加し(ステップS817)、オフセットデータを“10,11,12,129”を圧縮したものとする。このとき、オフセットデータを表すのに必要なビット長が、あらかじめオフセットデータについて設定した固定ビット長W以下であれば(ステップS818)、更新したオフセットデータを出力して更新処理を終了する(ステップS819)。W以上であった場合、追加したオフセットの129は格納不可であるため(ステップS814)、エラーを出力してオフセットデータを更新せずに処理を終了する。
図6は、データ蓄積装置のキー値によるデータの完全一致検索処理を説明するフローチャートである。
まず、探索したいキー値Xが入力される(ステップS911)。索引ファイルから探索キー値X以上でもっとも値が小さいキー値Aを捜し、その値Aが指すレコードを含む論理ブロックD1を読み込む(ステップS912)。次に、読み込んだ論理ブロックD1内のレコード部から二分探索を用いて探索キー値Xを持つレコードを探す(ステップS913)。
このとき、探索キー値Xを持つレコードが見つかったのであれば(ステップS914)、探索キー値Xを持つレコードを出力して終了する(ステップS921)。探索キー値Xを持つレコードが見つからなかった場合、別の論理ブロックにあるレコードを調べるため、読み込んだ論理ブロックD1に対応したオフセットデータをオフセットファイルから読み込む(ステップS915)。その後、読み込んだオフセットデータを入力として、「オフセットデータ参照」処理を行う(ステップS916)。本処理の詳細は後述するが、これにより、オフセット整数値列Fを得ることができる。そのあと、オフセット整数値列Fの要素すべてについて(ステップS917)、その要素が示すオフセット数をGとして、論理ブロックD1のGブロック先の論理ブロックD2を読み込み(ステップS918)、D2が探索キー値Xを持つかどうかを二分探索を用いてチェックする(ステップS919)。探索キー値Xを持つレコードが見つかれば(ステップS920)、そのレコードを出力し、処理を終了する(ステップS921)。もし、オフセット整数値列Fのすべての要素をチェックしても探索キー値Xを持つレコードが見つからなければ、該当レコードは無しと出力し、処理を終了する(ステップS922)。
図7は、図6のオフセットデータ参照処理S916を説明するフローチャートである。
オフセットデータ参照処理S916では、入力としてオフセットデータを受け取る。例として、“10,11,12,129”の整数値列を圧縮したものが入力されたオフセットデータだとする。このオフセットデータを元の整数値列に戻す処理を行う。先頭から順に1バイトずつ読み込み(ステップS953)、バイトのヘッダ先頭1ビットが1かどうかを確認する(ステップS954)。このとき、先頭1ビットが0であれば(ステップS954)、続く次の1バイトも同数値を表現するためのバイトとみなし(ステップS955)、それをチェックする(ステップS953)。先頭1ビットが1であれば(ステップS954)、そこまで読み込んできたバイトをまとめて1つの整数値を表現しているとみなし、各バイトの先頭1ビットのヘッダを削除する処理を行う(ステップS957)。例ではこのとき、オフセットデータが(10001010 10001011 10001100 00000001 10000001)となっているので、1バイトの数値が3個“10,11,12”、2バイトの数値が1個“129”であることがわかる。このようにしてすべてのバイトを10進数に変換し(ステップS958)、これを出力して処理を終了する。
図8及び図9はデータ蓄積装置10のキー値による範囲検索処理を示すフローチャートである。
まず、入力として下限キー値以上、上限キー値未満という検索条件が与えられるとする(ステップS1101)。索引ファイルから下限キー値以上でもっとも値が小さいキー値を捜してその値が指すレコードを含む論理ブロックをデータファイルから読み込む(ステップS1102)。続いて、読み込んだ論理ブロックに対応したオフセットデータを、オフセットファイルから読み込む(ステップS1103)。この読み込んだオフセットデータを入力として、「オフセットデータ参照」処理を行い(ステップS916)、出力として、オフセット整数値列Fを得る。このオフセット整数値列Fの各要素に、読み込んだ論理ブロックのブロック位置を加算し、これらをブロック位置集合Uとして一時的に記録する(ステップS1105)。
次に、論理ブロックのレコード部の先頭のレコードから順番にレコードのキー値が下限キー値以上かどうか調べていく(ステップS1107)。下限キー値以上のレコードが見つかったら、まず論理ブロック内で最大のキー値を持つ末尾のレコードを参照し、そのキー値が上限キー値以上かどうかを調べる(ステップS1109)。このとき、上限キー値以上でなければ、この論理ブロックの現在参照しているレコードから末尾のレコードまでのすべてのレコードは検索条件を満たすとして、検索条件を満たすレコード集合Rに追加する(ステップS1116)。その後、データファイル内に次の論理ブロックがあれば(ステップS1117)それを読み込み同様の処理を行う(ステップS1118)。論理ブロックがなければ、そこで検索終了となり、レコード集合Rを出力して終了する(ステップS1125)。
末尾のレコードのキー値が上限キー値以上だった場合(ステップS1109)は、参照しているレコードから末尾のレコードまで順番にキー値が上限値未満かどうかの比較を行っていく(ステップS1110)。もし参照しているレコードのキー値が上限キー値未満であれば、そのレコードを検索条件を満たすレコード集合Rに追加する(ステップS1111)。上限キー値未満でないレコードを見つけたら、次はオフセットデータが指している論理ブロックのレコードについて検索を行う(ステップS1113)。
ブロック位置集合Uが持つ全てのブロック位置の論理ブロックを参照し(ステップS1114)、そのうちのまだ探索していないブロックのレコードから下限キー値以上、上限キー値未満になるレコードを順番に見つけ、検索条件を満たすレコード集合Rに追加していく(ステップS1123)。ブロック位置集合Uが持つ全てのアドレスが指す論理ブロックの探索が終わったら、検索終了となり、レコード集合Rを出力して終了する(ステップS1125)。
データ蓄積装置10の利点は、より効率的に大きなデータ到着遅延を表すオフセットに対応可能であることである。従来は、オフセットの表現にビット番号を使用しているため、オフセットデータのビット列長であるWが、記録可能な最大のオフセットとなる。一方、データ蓄積装置10は、最大28ビットを用いて1つの数値を表すことができるため、より効率的に大きなオフセットを示すことが可能である。上記例において、オフセットとして“10,11,12,129”を格納するが、従来では129ビットが必要になるのと比べ、データ蓄積装置10は、40ビットで格納することができる。このため、突発的な要因で発生する怖れのある大きな到着遅延に効率的に対応することができる。
(実施形態2)
実施形態2は、オフセットの表現にSimple9で圧縮した整数値を用いる形態である。実施形態2のデータ蓄積装置の構成は図1のデータ蓄積装置10と同様である。
図10は、実施形態2のデータ蓄積装置のデータ構造を説明する図である。
オフセットファイル333’における各レコードであるオフセットデータは、固定長Wビットのデータである。ファイル上での位置を用いて、データファイルの各論理ブロックに一対一で対応している。オフセットデータは圧縮したオフセット数値列を格納するコード部と、コード部に格納したオフセット数値列の要素数およびコード部の4バイトの符号の数を表すヘッダ部から構成される。オフセット数値列の圧縮はSimple9を用いて行う。Simple9は1つの整数値を通常4バイト(32ビット)で表現するところを、その大きさに合わせて1〜28ビットで表現してデータを圧縮する。
図11及び図12は実施形態2のデータ蓄積装置におけるデータ追加処理を示すフローチャートである。図3及び図4のフローチャートとの違いはオフセットデータ更新処理がステップS716’である点である。
図13は、実施形態2におけるオフセットデータ更新処理S716’を説明するフローチャートである。
オフセットデータ更新処理S716’では、入力としてオフセットとオフセットデータを受け取る。例として、入力されるオフセットデータは“10,11,12”の数値列をエンコードしたもの、オフセットは129だとする。
オフセットデータ更新処理S716’では、オフセットデータのSimple9のデコード(ステップS831)、デコードしたオフセットデータへのオフセットの追加(ステップS832)、オフセットデータのSimple9へのエンコード(ステップS833)という順で処理が行われる。
本例では、まずSimple9でエンコード済みの“10,11,12”をデコードし、デコードした数値列に129を追加し、“10,11,12,129”の数値列をSimple9でエンコードして、そのエンコードしたビット列が固定長Wビットに収まるかどうかを判定し(ステップS834)、収まっていたのであれば、更新したオフセットデータを出力して処理を終了する。
図14は、図13のSimple9エンコード処理(ステップS833)を説明するフローチャートである。
Simple9エンコード処理S833では、入力として、非負の整数値列を受け取る。エンコード処理では、まず、入力された整数値列の要素順に、要素とその1つ後の要素との差を計算し(ステップS1004)、記録していく(ステップS1003〜ステップS1005)。例として挙げた“10,11,12,129”の数値列は、計算後、“10,1,1,117”となる。この計算後の数値列に対して、Simple9によるエンコードを行っていく。先頭から数値列の要素をチェックして行き、数値が何ビットで表現できるかどうかをチェックする(ステップS1011〜ステップS1013)。“10,1,1,117”をエンコードする場合、最初の3要素である“10,1,1”は4ビットでエンコード可能だが、その後に続く117はエンコードに7ビットが必要なので、これらの数値列のエンコードは全て7ビット用いて行う。このとき、ビット列のヘッダとして、4ビットのヘッダ(0101)を付加することで、続く28ビットが7ビット単位で数値を表現することを示す(ステップS1012)。続く28ビットは、“10,1,1,117”をそれぞれ7ビットで表し、ビット列(0001010 0000001 0000001 1110101)を得る。この結果“10,1,1,117”をエンコードした32ビットの符号は(0101 0001010 0000001 0000001 1110101)となり、これをSimple9の1つの符号として記録する(ステップS1018)。最後にオフセットデータのヘッダ部にエンコードした数値の数N=4とSimple9の符号の個数T=1を記入し(ステップS1020)、オフセットデータを出力し処理を終了する。
図15は、図13のSimple9デコード処理(ステップS831)を示すフローチャートである。
Simple9デコード処理S831では、入力としてオフセットデータを受け取る。例として、入力されるオフセットデータは“10,11,12,129”の数値列をエンコードした(0101 0001010 0000001 0000001 1110101)とする。まず、オフセットデータのヘッダ部を参照して、32ビットのSimple9符号の個数T=1とエンコードされた整数値の合計N=4を取得する(ステップS1031)。その後、T個のすべてのSimple9符号について先頭から順に復号処理を行っていく(ステップS1033〜ステップS1038)。復号処理では、各符号のヘッダである上位4ビットを参照することで、そのあとに続く28ビットを何ビットずつに区切って10進数の整数値に変換すればよいのかを得る。本例の(0101 0001010 0000001 0000001 1110101)では、先頭4ビットが(0101)であり、これは続く28ビットを7ビットずつに区切ることを示すので、(0001010,0000001,0000001,1110101)を10進数に変換した数列“10,1,1,117”が得られる。さらに、この得られた数列に対して、先頭から順番に、要素とその一つ前の要素との和を計算し、その和を新しい要素として、数列の更新を行う(ステップS1041)。これを数列の末尾の要素まで繰り返す(ステップS1040〜ステップS1042)。本例では、“10,1,1,117”であるので、ここから計算し得られる数列は“10,11,12,129”となる。Simple9デコード処理S831は、この数列をデコード結果として出力し、処理を終了する。
図16は実施形態2のデータ蓄積装置におけるキー値による完全一致検索処理を説明するフローチャートである。
完全一致検索処理は、図6で説明した実施形態1の完全一致検索処理と同様の処理を行っているが、図6のオフセットデータ参照処理S916がSimple9デコード処理S831となる点が異なる。
図17及び図18は実施形態2のデータ蓄積装置におけるキー値による範囲検索処理を説明するフローチャートである。
範囲検索処理は、図8及び図9で説明した実施形態1の範囲検索処理と同様の処理を行っているが、オフセットデータ参照処理S1104がSimple9デコード処理S831となる点が異なる。
実施形態2のデータ蓄積装置の利点は、実施形態1のデータ蓄積装置10と同様に大きなオフセットを効率的に表現できるだけでなく、さらに小さなオフセットに対しても最小で1ビットで表現でき、小さいオフセットも効率良く表現できる点である。実施例で挙げた例では、オフセットとして、“10,11,12,129”を格納するが、従来の方法では、129ビットが必要になるのと比べ、実施形態2では、32ビットにヘッダ分のビット数、例えば32ビット、を加えた64ビットで格納することができる。
(実施形態3)
実施の形態3は、オフセットの表現にビット番号を用い、0もしくは1のビットが連続した場合にRun Length圧縮を用いる方法である。実施形態3のデータ蓄積装置の構成は図1のデータ蓄積装置10と同様である。
図19は、実施形態3のデータ蓄積装置のデータ構造を説明する図である。
オフセットファイル333”における各レコードであるオフセットデータは、固定長Wビットのデータである。ファイル上での位置を用いて、データファイルの各論理ブロックに一対一で対応している。オフセットデータは、1つのコード長記憶部、1つの圧縮回数記憶部、複数の圧縮位置および圧縮ビット数記憶部、1つのコード部で構成される。コード長記憶部は、コード部で利用されているビット数を保持する。圧縮回数記憶部は、続く圧縮位置および圧縮ビット数記憶部の個数を保持する。圧縮位置および圧縮ビット数記憶部は、続くコード部において、圧縮が行われているビット位置とそこで圧縮されたビット数を保持する。コード部では圧縮処理後のビット列が保持される。
コード部のビット列において、1となるビットのビット位置が基本的にデータの遅れブロック数を示す。ただし、このとき、コード部において、ビットの1もしくは0が、しきい値k個以上続く場合には、これをRun Length圧縮する。このとき、圧縮位置および圧縮ビット数記憶部として、Run Length圧縮を開始した位置と、圧縮したビット数を記入したものを作成し、オフセットデータに追加する。この追加した圧縮位置および圧縮ビット数記憶部の個数は、圧縮回数記憶部に記入し随時加算していく。
図20及び図21は実施形態3のデータ蓄積装置におけるデータ追加処理を示すフローチャートである。図3及び図4のフローチャートとの違いはオフセットデータ更新処理がステップS716”である点である。
図22は実施形態3のオフセットデータ更新処理S716”を説明するフローチャートである。
オフセットデータ更新処理S716”では、入力としてオフセットデータXと追加するオフセットYを受け取る。例として、入力するオフセットデータXは“10,11,12”の数値列をオフセットデータ圧縮処理によって圧縮したもの、追加するオフセットYは129だとする。
オフセット更新処理S716”では、まず、圧縮回数記憶部を参照し、圧縮位置および圧縮ビット数記憶部の個数Mを得る(ステップS851)。次に、M個の圧縮位置および圧縮ビット数記憶部を読み込み、M個の圧縮位置P[1..M]と圧縮ビット数S[1..M]を記憶する(ステップS852)。次に、M個の圧縮ビット数S[1..M] をすべて足し合わせ、これに最後の分割位置P[M]を足すことで、オフセットデータが記録する圧縮部分を伸長した場合の末尾のビット位置を得、この値をLast_Pとする(ステップS853〜ステップS857、ステップS860)。次に、追加するオフセットYとLast_Pの値を比較し、YとLast_Pを1増加させた値が等しければ(ステップS858)、M番目の圧縮ビット数が1増えたとみなし、圧縮ビット数S[M]を1増加させる(ステップS859)。YとLast_Pを1増加させた値が等しくなければ、オフセットデータXのコード部において、YからLast_Pを引いた値の位置のビットを1にする(ステップS861)。また、コード長記憶部Nの値をYからLast_Pを引いたものとして更新する(ステップS862)。このようにして更新されたオフセットデータXをオフセット圧縮処理(ステップS863)に入力し、その結果出力として、圧縮されたオフセットデータZを得る。その後、オフセットデータZがあらかじめ決められた固定長Wビットに収まるかどうかを判定し(ステップS864)、オフセットデータ更新処理を終了する。
例では、オフセットデータは“10,11,12”をオフセット圧縮処理によって圧縮したものであり、これをビット列で表すと10番目、11番目、12番目のビットが1となったビット列(00000000 0111)となる。これにオフセットである“129”を加えた場合、これをビット列で表せば、“12”と“129”との間には、116個の0が存在することになる。この116個の0ビットをRun Length圧縮すると、圧縮回数は1、圧縮位置と圧縮ビット数はそれぞれ“13,115”となり、コード部のビット列は(00000000 011101)となる。また、別の例として、“11,12,13,・・・,98,99,100”と数字が連続しているオフセットデータがあるとし、これに新たなオフセット101を加えるとする。このデータはRun Length圧縮により、圧縮位置と圧縮ビット数が“11,89”、コード部が(00000000 001)となる。これにオフセット101を追加する場合、最後の数値よりも1だけ大きいので、圧縮ビット数のみを更新して、圧縮位置と圧縮ビット数を“11,90”とすれば、オフセット101を加えたこととなる。
図23は、図22のオフセットデータ圧縮処理S863を説明するフローチャートである。
オフセットデータ圧縮処理S863では、入力としてオフセットデータを受ける。このオフセットデータに対して、圧縮可能な部分を探索し、Run Length圧縮を行っていく。まず、オフセットデータのコード長記憶部、圧縮回数記憶部をそれぞれ参照し、コード部のビット数Nと圧縮位置および圧縮ビット数記憶部の個数Mを得る(ステップS1051、ステップS1052)。次に、Mが0よりも大きいかどうかの判定を行う(ステップS1055)。Mが0よりも大きい場合、オフセットデータに対して圧縮が行われているため、すでに圧縮が行われている部分をスキップするため、i=P[M]+1とし(ステップS1056)、圧縮が行われた末尾のビットの次のビットから圧縮可能な部分の探索を始める。Mが0以下である場合、オフセットデータに対して圧縮が行われていないため、i=1とし、コード部の先頭のビットから圧縮可能な部分の探索を始める(ステップS1057)。圧縮可能な部分の探索には、iを1ずつ増加させながら(ステップS1058)、X[i]とX[i−1]の比較を行うことで(ステップS1059)、0もしくは1のビットが連続しているかどうかを判定し、連続していれば、counterを1ずつ増加することで、連続した数を数え上げていく(ステップS1060)。X[i]とX[i−1]が異なる場合、0もしくは1のビットの連続が途切れたとみなし、連続したビットの数を示すcounterがしきい値Kを超えるかどうかにより(ステップS1068)、これを圧縮するかどうかの判定を行う。counterがK以上であれば、圧縮処理を行う。圧縮処理では、まず、圧縮回数を示すMを1増加させる(ステップS1069)。次に、圧縮ビット数を示すS[M]をcounterとする(ステップS1070)。続いて、圧縮位置を示すP[M]は、iから1を引き、さらにcounter を引いた値とする(ステップS1071)。次に、圧縮したビット数の分だけビットを前に詰める処理を行う(ステップS1073〜ステップS1076)。さらに、コード部の有効なビットの長さを示すNも圧縮にあわせてcounterだけ減らす(ステップS1077)。最後に、現在チェックしているビットの位置を示すiをi=P[M]+1とし、圧縮が行われたビットの次のビットの位置とする(ステップS1078)。
一方、0もしくは1のビットが連続したまま、すべてのコード部のビットの末尾まで到達した場合にも、その連続した数がしきい値Kを超えて入れば、圧縮処理を行う(ステップS1062)。この圧縮処理では、まず、圧縮回数を示すMを1増加させ(ステップS1063)、圧縮ビット数を示すS[M]をcounterとするが(ステップS1064)、圧縮位置を示すP[M]は、iからcounterを引いた値とする(ステップS1065)。次に、コード部の有効なビットの長さを示すNも圧縮に合わせてcounterだけ減らす(ステップS1066)。最後に、N,M,P,S,Xをそれぞれオフセットデータのコード長記憶部、圧縮回数記憶部、圧縮位置および圧縮ビット数記憶部、コード部に反映し、オフセットデータを更新する(ステップS1067)。更新したオフセットデータを出力して、圧縮処理を終了する。
例として、図22で示したオフセットデータ更新処理S716”において、オフセットデータXが“10,11,12”の数値列をオフセットデータ圧縮処理によって圧縮したもの、追加するオフセットYが129、しきい値Kが32である場合を考える。オフセットデータXはコード長N=12、圧縮回数M=0、コード部が(000000000111)となったデータである。M=0であり、圧縮位置および圧縮ビット数記憶部は存在しないため、P[1]=0、S[1]=0とする。このため、Sum_SおよびLast_Pも0となる。Yは129であり、これはLast_Pに1加えたものと等しくないため、オフセットデータXのコード部の129番目のビットを1にし、間のビットは0で埋める。Nも同様に129とし、オフセットデータXを更新する。次に、更新したオフセットデータXを入力として、図23に示すオフセットデータ圧縮処理S863を行う。
オフセットデータ圧縮処理S863では、まず、コード長記憶部、圧縮回数記憶部を参照し、コード長N=129,圧縮回数M=0を得る。また、M=0であり、圧縮位置および圧縮ビット数記憶部が存在しないため、P[1]=0、S[1]=0とする。コード部を読み込み、これをX[1...129]とする。M=0であるので、i=1とし、Xの先頭ビットから同じビットが連続しているかどうかのチェックを行う。Xは、(000000000111000・・・0001)であるので、最初の9ビットは0が連続している。しかし、9個の連続ビットでは、counterは8となり、しきい値Kの32を超えないため、圧縮は行われない。続く(111)についても同様に3ビットのみの連続で、counterは2となり、しきい値Kよりも小さいため、圧縮を行わない。続く0は116ビット連続しており、counterは115となり、しきい値Kよりも大きいため、圧縮を行う。まず、圧縮回数であるMを1増加させ、M=1とする。次に、S[M]にcounterの値を代入し、S[M]=115とする。また、P[M]については、i=129から1とcounter=115を引いた値となり、13となる。続いて、圧縮したビットの数だけ、圧縮した位置よりも後方のビットを前に詰める処理を行う。その後、コード長N=129から圧縮した分であるcounter=115だけ減らし、N=14とする。最後に、次にチェックするビットの位置であるiを圧縮したビットの次の位置であるP[M]+1=14とし、counterを0にセットしてループへ戻る。この時点で、iはNよりも小さくなくなったので、ループを抜け、コード長N=14、圧縮回数M=1、圧縮位置P[1]=13、圧縮ビット数S[1]=115、X=(00000000011101)をオフセットデータに反映させてこれを更新し、出力して処理を終了し、図22のオフセットデータ更新処理S716”に戻る。
ここで、得られたオフセットデータZがあらかじめ決められたオフセットデータの固定長であるWを超えるかどうかを判定し、越えなければ、オフセットデータ更新を終了する。もし、越えてしまうのであれば、オフセットYは格納不可だったとして、その旨を出力する。その際、オフセットデータ更新は行われず、更新前のオフセットデータのままとする。
図24は実施形態3のデータ蓄積装置におけるキー値による完全一致検索処理を説明するフローチャートである。
完全一致検索処理では、図6で説明した実施形態1の完全一致検索処理と同様の処理を行っていくが、図6のオフセットデータ参照処理S916がオフセットデータ参照処理S916”となる。
図25は、図24のオフセットデータ参照処理S916”を説明するフローチャートである。
オフセットデータ参照処理では、入力としてオフセットデータを受ける。まず、オフセットデータの圧縮回数記憶部を参照し、圧縮位置および圧縮ビット数記憶部の個数Mを得る(ステップS960)。続いて、M個の圧縮位置および圧縮ビット数記憶部を読み込み、圧縮位置P[1..M]と、圧縮ビット数S[1..M]を得る(ステップS961)。次に、オフセットデータのコード長記憶部を参照し、コード長Nを得(ステップS962)、オフセットデータのコード部の各ビットをX[1..N]に記憶する(ステップS963)。次に、オフセットを整数列として一時的に記憶する領域を用意して、これをFとする(ステップS964)。iをビット位置を示すカウンタ、jを圧縮位置および圧縮ビット数記憶部の位置を示すカウンタ、skipを圧縮したビット数の合計として、処理を進めていく(ステップS965)。まず、P[j]をiと比較し、X[i]が圧縮されたビットかどうかの確認を行う(ステップS966)。X[i]が圧縮されたビットでなければ、そのビットが0か1かを確認する(ステップS973)。もし1であれば、それが示すオフセットをiとskipを足し合わせることで求め(ステップS974)、これをFに記憶する(ステップS975)。もし0であれば(ステップS973)、これはオフセットを示さないので計算を行わない。この後、iとNを比較し(ステップS971)、iがNよりも小さければ、iを1増やし(ステップS972)、iとP[j]の比較へ戻る。iがN以上であれば、Fを出力して終了する。
X[i]が圧縮されたビットである場合も同様に、そのビットが0か1かを確認する(ステップS967)。もし、1であれば、X[i]が示すオフセットすべてを求めるため、counter=0とし(ステップS976)、offset=i+skip+counterとして、オフセットを計算し(ステップS977)、Fに記憶する(ステップS978)。これを、counterがS[j]と等しくなるまで、1ずつ増加させて繰り返すことで(ステップS979、ステップS980)、X[i]が示す全てのオフセットをFに記憶する。その後、skipにS[i]を加算してskipを更新する(ステップS968)。X[i]が0の場合は、オフセットの計算および記憶は行わず、skipの更新のみを行う(ステップS968)。skipの更新を行ったら、jとMを比較し(ステップS969)、jがMよりも小さければjを1増やす(ステップS970)。その後、先のiとNの比較に移り(ステップS971)、同様の処理を行う。
例として、図25で示したオフセットデータ参照処理S916”において、入力するオフセットデータを先の図22で示したオフセットデータ更新処理S716”によって圧縮した“10,11,12,129”とした場合を考える。このとき、M=1,P[1]=13,S[1]=115,N=14,X=(00000000011101)となる。
i=1からi=9では、P[1]=13,かつX[i]=0となるため、オフセット整数列のFは更新されない。i=10,11,12では、X[i]=1であるので、offsetを計算しFに記憶し、F=“10,11,12”となる。i=13のときi=P[1]=13であるため、X[13]が圧縮されたビットであることがわかる。このとき、X[13]=0なので、skipの更新のみを行い、skip=115となる。j=1,M=1であるので、jは更新せず、iのみ1増加させi=14とする。X[14]=1であるので、offsetをoffset=i+skipと計算し、offset=129を得、Fを更新し、F=“10,11,12,129”となる。i=N=14となったため、Fを出力し、これでオフセットデータ参照処理を終了する。
図26及び図27は実施形態3のデータ蓄積装置におけるキー値による範囲検索処理を説明するフローチャートである。
範囲検索処理は、図8及び図9で示した実施形態1の範囲検索処理と同様の処理を行っていくが、オフセットデータ参照処理S1104が図25で説明したオフセットデータ参照処理S916”となる点が異なる。
実施形態3のデータ蓄積装置は、データ到着遅延が連続して発生するようなデータに特化した方法を採用している。データソース側の回線切断などにより、出力バッファに溜まったデータが回線復旧後にまとめて送られてくる場合など、大きなオフセットの値が連続して続く場合に効率的にオフセットを表現することができる。実施例で挙げた例では、オフセットとして、“10,11,12,129”を格納するが、従来の方法では、129ビットが必要になるのと比べ、実施形態3では、コード長記憶部のサイズH1を16ビット、圧縮回数記憶部のサイズH2を8ビット、圧縮位置及び圧縮ビット数記憶部のサイズH3を32ビットとすると、コード部は14ビットのため、合計70ビットで格納することができる。
(圧縮の効果)
次に、本発明の各圧縮方法によるビット効率向上の例をグラフで示す。以下の例では、Simple9のオフセットデータにおけるヘッダ部の大きさを32ビット、Run Length圧縮のオフセットデータにおけるコード長記憶部の大きさを16ビット、圧縮回数記憶部の大きさを8ビット、圧縮位置および圧縮ビット数記憶部のサイズを32ビットとして計算を行っている。
図28は、あるオフセット数をオフセットデータに格納する場合に、必要となるビット数の圧縮方法による違いを示すグラフである。従来の方式であるBitmapと、本実施形態の各方式であるVariable Byte Code、Simple9、Run Length圧縮について比較を行っている。横軸は表現するオフセット数、縦軸は横軸に対応するオフセット数を格納するために必要なビット数を、それぞれ対数軸で表している。グラフより、本実施形態の各方式は、従来の方式であるBitmapに比べて、必要となるビット数の増加が、オフセット数の増加に対して、よりゆるやかであることが確認できる。
図29はある範囲で連続しているオフセット数をオフセットデータに格納する場合に、必要なビット数の圧縮方法による違いを示すグラフである。従来の方式であるBitmapと、本実施形態の各方式であるVariable Byte Code、Simple9、Run Length圧縮について比較を行っている。横軸は連続したオフセット数の範囲を示しており、“1−10”は“1,2,3,4,5,6,7,8,9,10”のオフセット数値列を表している。縦軸は横軸で示されたオフセット数値列をオフセットデータに格納するために必要となるビット数を対数軸で示している。グラフより、オフセット数が連続して並ぶ場合、従来の方法であるBitmapのビット効率が良いことがわかるが、Run Lengthは“1−70”以上の場合にBitmapを超えるビット効率を持つことがわかる。
図30は、1から10の連続したオフセット数値列に加えて、100、200、300、400、500、600、700、800のいずれかのオフセット数をオフセットデータとして格納する場合に、必要となるビット数の圧縮方法による違いを示すグラフである。従来の方式であるBitmapと、本実施形態の各方式であるVariable Byte Code、Simple9、Run Length圧縮について比較を行っている。横軸は加えて格納するオフセット数を示し、縦軸は横軸で示されたオフセット数を加えた場合に、これをオフセットデータとして格納するために必要となるビット数を示している。グラフより、従来の方法であるBitmapでは、必要となるビット数が追加して格納するオフセット数の大きさに対応して線形に増加していることに対して、本実施形態の各方式ではほぼ必要となるビット数に変化がなく、高いビット効率でオフセット数を格納できていることがわかる。
図31は1から64の連続したオフセット数値列に加えて、100、200、300、400、500、600、700、800のいずれかのオフセット数をオフセットデータとして格納する場合に、必要となるビット数の圧縮方法による違いを示すグラフである。従来の方式であるBitmapと、本実施形態の各方式であるVariable Byte Code、Simple9、Run Length圧縮について比較を行っている。横軸は加えて格納するオフセット数を示し、縦軸は横軸で示されたオフセット数を加えた場合に、これをオフセットデータとして格納するために必要となるビット数を示している。グラフより、従来の方法であるBitmapでは、必要となるビット数が追加して格納するオフセット数の大きさに対応して線形に増加していることに対して、本実施形態の各方式では必要となるビット数にほぼ変化がなく、特に、Run Length圧縮がどのようなオフセット数値列を加えた場合でも、Bitmap以上のビット効率を持つことがわかる。
(他の実施形態)
上述した各データ蓄積装置はコンピュータとプログラムによっても実現できる。上述した各データ蓄積装置の動作をコンピュータで実行可能なプログラムとし、これをコンピュータが読み取り可能な記録媒体に記録することも、ネットワークを通してコンピュータに提供することも可能である。
10:データ蓄積装置
110:インタフェース
120:バッファメモリ
300:システム制御部
301:入力データ解析部
302:メモリ管理部
303:ファイル操作部
304:オフセット圧縮部
330:二次記憶装置
331:索引ファイル
332:データファイル
333、333’、333”:オフセットファイル

Claims (9)

  1. レコードを最小単位として連続して入力されるデータを、論理ブロックを単位として逐次蓄積する二次記憶装置と、
    前記レコードの特定の値をキー値としてスパースインデックス(sparse index)による索引付けを行い、一の論理ブロックが受け持つキー値の範囲に含まれる前記キー値を持つ前記レコードが他の論理ブロックにある場合には、前記一の論理ブロックから前記他の論理ブロックへのオフセット数をビット列で表現して圧縮したオフセットデータをオフセットファイルとして前記二次記憶装置に記録させるシステム制御手段と、
    を備えるデータ蓄積装置。
  2. 前記システム制御手段は、
    前記オフセットデータを、コード長記憶部、圧縮回数記憶部、圧縮位置及び圧縮ビット数記憶部、並びにコード部で構成し、
    前記コード部において、前記オフセット数と等しいビット位置のビットを「1」とし、
    前記コード部のビット列が予め設定したしきい値以上同一のビットが連続する連続ビット部を含む場合に、前記連続ビット部のビット数を数え上げ、前記連続ビット部の先頭の位置と前記連続ビット部のビット数を前記圧縮位置及び圧縮ビット数記憶部に記録し、
    前記連続ビット部の先頭のビットを残して前記連続ビット部の他のビットを削除する
    オフセット圧縮部を有することを特徴とする請求項1に記載のデータ蓄積装置。
  3. 前記システム制御手段は、
    一の論理ブロックが受け持つ前記キー値の範囲に含まれる前記キー値を持つ前記レコードが他の複数の論理ブロックにある場合、前記一の論理ブロックから前記他の複数の論理ブロックへの前記オフセット数をそれぞれ求め、前記他の複数の論理ブロックのうち最もブロック位置が近い論理ブロック同士について、求めた前記オフセット数からそれぞれの論理ブロックへのオフセット数の差を求め、これを差分オフセット数とし、
    前記オフセットデータを、ヘッダ部並びにコード部で構成し、
    前記コード部に、単数の前記オフセット数もしくは複数の前記差分オフセット数を前記オフセット数もしくは前記差分オフセット数に応じたビット数で表現したオフセットビット列、及び前記オフセットビット列のビット数を記載した一定ビット数の符号ヘッダ、で形成される符号を格納し、
    前記ヘッダ部に、前記符号の個数及び前記オフセット数の個数を表示する
    オフセット圧縮部を有することを特徴とする請求項1に記載のデータ蓄積装置。
  4. 前記システム制御手段は、
    前記オフセットデータを複数のバイトで構成し、
    前記オフセット数に応じたバイト数で前記オフセット数を表現する際に、前記オフセット数を表現する各バイトの一定数のビットをヘッダとし、前記オフセット数を表現したバイト数を前記ヘッダで表示する
    オフセット圧縮部を有することを特徴とする請求項1に記載のデータ蓄積装置。
  5. レコードを最小単位として連続して入力されるデータを、論理ブロックを単位として二次記憶装置に逐次蓄積する際に、
    前記レコードの特定の値をキー値としてスパースインデックス(sparse index)による索引付けを行い、一の論理ブロックが受け持つキー値の範囲に含まれる前記キー値を持つ前記レコードが他の論理ブロックにある場合には、前記一の論理ブロックから前記他の論理ブロックへのオフセット数をビット列で表現して圧縮したオフセットデータをオフセットファイルとして前記二次記憶装置に記録させるシステム制御手順を行うデータ蓄積方法。
  6. 前記システム制御手順は、
    前記オフセットデータを、コード長記憶部、圧縮回数記憶部、圧縮位置及び圧縮ビット数記憶部、並びにコード部で構成し、
    前記コード部において、前記オフセット数と等しいビット位置のビットを「1」とし、
    前記コード部のビット列が予め設定したしきい値以上同一のビットが連続する連続ビット部を含む場合に、前記連続ビット部のビット数を数え上げ、前記連続ビット部の先頭の位置と前記連続ビット部のビット数を前記圧縮位置及び圧縮ビット数記憶部に記録し、
    前記連続ビット部の先頭のビットを残して前記連続ビット部の他のビットを削除する
    ことを特徴とする請求項5に記載のデータ蓄積方法。
  7. 前記システム制御手順は、
    一の論理ブロックが受け持つ前記キー値の範囲に含まれる前記キー値を持つ前記レコードが他の複数の論理ブロックにある場合、前記一の論理ブロックから前記他の複数の論理ブロックへの前記オフセット数をそれぞれ求め、前記他の複数の論理ブロックのうち最もブロック位置が近い論理ブロック同士について、求めた前記オフセット数からそれぞれの論理ブロックへのオフセット数の差を求め、これを差分オフセット数とし、
    前記オフセットデータを、ヘッダ部並びにコード部で構成し、
    前記コード部に、単数の前記オフセット数もしくは複数の前記差分オフセット数を前記オフセット数もしくは前記差分オフセット数に応じたビット数で表現したオフセットビット列、及び前記オフセットビット列のビット数を記載した一定ビット数の符号ヘッダ、で形成される符号を格納し、
    前記ヘッダ部に、前記符号の個数及び前記オフセット数の個数を表示する
    ことを特徴とする請求項5に記載のデータ蓄積方法。
  8. 前記システム制御手順は、
    前記オフセットデータを複数のバイトで構成し、
    前記オフセット数に応じたバイト数で前記オフセット数を表現する際に、前記オフセット数を表現する各バイトの一定数のビットをヘッダとし、前記オフセット数を表現したバイト数を前記ヘッダで表示する
    ことを特徴とする請求項5に記載のデータ蓄積方法。
  9. コンピュータに、請求項5から8のいずれかに記載のデータ蓄積方法の前記システム制御手順を実行させるためのプログラム。
JP2011142884A 2011-06-28 2011-06-28 データ蓄積装置、データ蓄積方法、及びプログラム Expired - Fee Related JP5639011B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2011142884A JP5639011B2 (ja) 2011-06-28 2011-06-28 データ蓄積装置、データ蓄積方法、及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011142884A JP5639011B2 (ja) 2011-06-28 2011-06-28 データ蓄積装置、データ蓄積方法、及びプログラム

Publications (2)

Publication Number Publication Date
JP2013011946A true JP2013011946A (ja) 2013-01-17
JP5639011B2 JP5639011B2 (ja) 2014-12-10

Family

ID=47685795

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011142884A Expired - Fee Related JP5639011B2 (ja) 2011-06-28 2011-06-28 データ蓄積装置、データ蓄積方法、及びプログラム

Country Status (1)

Country Link
JP (1) JP5639011B2 (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101575015B1 (ko) * 2013-07-01 2015-12-07 (주) 솔텍시스템 시계열적 공정 데이터의 압축 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
US9979415B2 (en) 2015-02-16 2018-05-22 Mitsubishi Electric Corporation Data compression apparatus, data decompression apparatus, data compression method, data compression method, and computer readable medium
JPWO2019092990A1 (ja) * 2017-11-09 2020-04-02 日本電信電話株式会社 情報蓄積装置、データ処理システム、およびプログラム
CN112784271A (zh) * 2021-01-21 2021-05-11 国网河南省电力公司电力科学研究院 一种电力工控系统的控制软件逆向分析方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007088962A (ja) * 2005-09-26 2007-04-05 Nippon Telegr & Teleph Corp <Ntt> 順序データ圧縮方法、順序データ解凍方法、順序データ処理プログラム、順序データ圧縮装置、順序データ解凍装置、および、順序データ処理システム

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2007088962A (ja) * 2005-09-26 2007-04-05 Nippon Telegr & Teleph Corp <Ntt> 順序データ圧縮方法、順序データ解凍方法、順序データ処理プログラム、順序データ圧縮装置、順序データ解凍装置、および、順序データ処理システム

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
CSND200900734014; 岡野原大輔: '[速習]サーチエンジン 刻々と進化する検索技術の今 第2章 全文検索システムMiniseの作成 エン' WEB+DB PRESS 第53巻, 20091125, pp.105〜117, 株式会社技術評論社 *
CSNG201000331036; 山崎敬広ほか5名: '順序逆転のある時系列センサデータのための効率的な索引付方法の提案と性能評価' 電子情報通信学会技術研究報告 第109巻 第449号, 20100225, pp.241〜246, 社団法人電子情報通信学会 *
CSNJ201010043592; 山崎敬広ほか5名: '順序逆転のある時系列センサデータに対するオフセットビットマップを用いた効率的な索引付方法' 電子情報通信学会2010年総合大会講演論文集 通信2 , 20100302, p.592, 社団法人電子情報通信学会 *
JPN6014007346; 山崎敬広ほか5名: '順序逆転のある時系列センサデータのための効率的な索引付方法の提案と性能評価' 電子情報通信学会技術研究報告 第109巻 第449号, 20100225, pp.241〜246, 社団法人電子情報通信学会 *
JPN6014007348; 岡野原大輔: '[速習]サーチエンジン 刻々と進化する検索技術の今 第2章 全文検索システムMiniseの作成 エン' WEB+DB PRESS 第53巻, 20091125, pp.105〜117, 株式会社技術評論社 *
JPN6014007351; 山崎敬広ほか5名: '順序逆転のある時系列センサデータに対するオフセットビットマップを用いた効率的な索引付方法' 電子情報通信学会2010年総合大会講演論文集 通信2 , 20100302, p.592, 社団法人電子情報通信学会 *

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101575015B1 (ko) * 2013-07-01 2015-12-07 (주) 솔텍시스템 시계열적 공정 데이터의 압축 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
US9979415B2 (en) 2015-02-16 2018-05-22 Mitsubishi Electric Corporation Data compression apparatus, data decompression apparatus, data compression method, data compression method, and computer readable medium
JPWO2019092990A1 (ja) * 2017-11-09 2020-04-02 日本電信電話株式会社 情報蓄積装置、データ処理システム、およびプログラム
CN112784271A (zh) * 2021-01-21 2021-05-11 国网河南省电力公司电力科学研究院 一种电力工控系统的控制软件逆向分析方法
CN112784271B (zh) * 2021-01-21 2022-07-22 国网河南省电力公司电力科学研究院 一种电力工控系统的控制软件逆向分析方法

Also Published As

Publication number Publication date
JP5639011B2 (ja) 2014-12-10

Similar Documents

Publication Publication Date Title
JP5639011B2 (ja) データ蓄積装置、データ蓄積方法、及びプログラム
US10359939B2 (en) Data object processing method and apparatus
US9405790B2 (en) System, method and data structure for fast loading, storing and access to huge data sets in real time
CN101620617B (zh) 日志文件的查询和处理的方法及装置
US20120191672A1 (en) Dictionary for data deduplication
WO2013163813A1 (zh) 重复数据删除方法及装置
US10977315B2 (en) System and method for statistics-based pattern searching of compressed data and encrypted data
JP2011523152A (ja) 検索インデックスフォーマットの最適化
CN102782643A (zh) 使用布隆过滤器的索引搜索
EP2821924A1 (en) Method, device and system for querying data index
JPWO2011155551A1 (ja) ファイル記憶装置、ファイル記憶方法およびプログラム
CN109937411A (zh) 将接收的数据块存储为去重数据块的装置和方法
KR100946694B1 (ko) 영상 정보 기반의 동영상 파일 중복 검사와 관리를 위한시스템 및 방법
WO2009097710A1 (zh) 文件的组织、检索方法、文件组织模块、系统及存储媒介
CA2770348A1 (en) Compression of bitmaps and values
WO2014097359A1 (ja) 圧縮プログラム、圧縮方法、圧縮装置およびシステム
JP6252489B2 (ja) 圧縮装置、圧縮方法、圧縮プログラム、伸張装置、伸張方法、伸張プログラム、および圧縮伸張システム
CN111061428B (zh) 一种数据压缩的方法及装置
WO2014030180A1 (ja) 格納プログラム、格納方法、格納装置、伸張プログラム、伸張方法及び伸張装置
CN111078652A (zh) 物流箱码的归档压缩方法及装置
CN116303580A (zh) 数据查询方法、装置及数据库系统
CN115391696A (zh) 模型数据处理方法、装置、设备以及存储介质
CN109271463B (zh) 一种恢复MySQL数据库的innodb压缩数据的方法
CN107026652B (zh) 基于分区的正整数序列压缩方法
US10037148B2 (en) Facilitating reverse reading of sequentially stored, variable-length data

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20130730

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20140213

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20140225

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20140425

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20141021

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20141023

R150 Certificate of patent or registration of utility model

Ref document number: 5639011

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees