JP2014093612A - 符号化装置及びその制御方法 - Google Patents
符号化装置及びその制御方法 Download PDFInfo
- Publication number
- JP2014093612A JP2014093612A JP2012242216A JP2012242216A JP2014093612A JP 2014093612 A JP2014093612 A JP 2014093612A JP 2012242216 A JP2012242216 A JP 2012242216A JP 2012242216 A JP2012242216 A JP 2012242216A JP 2014093612 A JP2014093612 A JP 2014093612A
- Authority
- JP
- Japan
- Prior art keywords
- address
- character string
- storage area
- character
- encoding
- 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.)
- Pending
Links
Images
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
【課題】 固定サイズの辞書を用いながらも、より効率良く圧縮符号化することを可能にする。
【解決手段】 符号化対象文字列の先頭2文字から辞書101へのエントリアドレスを求める。そして、そのエントリアドレスで示される候補1、2、3に格納されたアドレスを参照し、符号済み領域100内の該当する文字位置を求め、それぞれの中から符号化対象文字列と一致する最長一致数はいずれであるかを判定し、その最長一致数と、最長一致数となった文字列の先頭アドレスを符号化する。
【選択図】 図1
【解決手段】 符号化対象文字列の先頭2文字から辞書101へのエントリアドレスを求める。そして、そのエントリアドレスで示される候補1、2、3に格納されたアドレスを参照し、符号済み領域100内の該当する文字位置を求め、それぞれの中から符号化対象文字列と一致する最長一致数はいずれであるかを判定し、その最長一致数と、最長一致数となった文字列の先頭アドレスを符号化する。
【選択図】 図1
Description
本発明は、例えば文字コードや画像データなどのデータストリームを辞書を用いて圧縮符号化する辞書型符号化技術に関する。
従来から、符号化済みの過去の文字列を参照することにより、符号化対象文字列を符号化する技術として、LZ77圧縮法などが知られている。
LZ77圧縮法では、既に圧縮を終えた文字列をスライドバッファ内に保持しておき、これから圧縮を行う文字列と、スライドバッファ内のデータを比較する。その結果、スライドバッファ内で、最も一致長の長い文字列の位置を特定する。そして、特定された文字列の先頭までのオフセット値(特定された文字列の先頭が、圧縮対象文字列の先頭からいくつ遡った位置になるかを示す値)と、一致した文字列の長さの組合せを圧縮する。その後、圧縮を終えた文字列の長さ分、スライドバッファをスライドして、次の文字列を圧縮する。つまり、LZ77圧縮法は、常に最新の圧縮済みのデータを辞書として用いており、そのためスライド辞書法とも呼ばれている。
図14に、LZ77圧縮法でデータが圧縮される様子を示す。図14(a)において、スライドバッファ1401は24文字分のバッファであり、図14(a)では、文字Aから文字Hまでが格納されている。圧縮対象となるのは、スライドバッファのすぐ後ろに続く、ABD…から始まる文字列である。LZ77圧縮法では、スライドバッファ1401内で、圧縮対象文字列に一致する最長文字列を検索する。図示の場合、スライドバッファ1401内の符号1402が示す文字列「ABDF」が、圧縮対象文字列に一致する最長文字列として検索される。この文字列ABDFの先頭文字の位置は、検索対象文字列より12文字だけ遡った位置にあり、そこから4文字が一致しているので、距離「12」と一致長「4」が圧縮されることとなる。
上記により、圧縮対象文字列の4文字「ABDF」が圧縮されたことになるので、スライドバッファ1401は圧縮された文字列の長さ分(ここでは、4文字)スライドし、図14(b)の状態となる。つまり、文字Kから文字Fまでがスライドバッファ内に入り、スライドバッファに続く、KEL…から始まる文字列が次の圧縮対象となる。
上記の如く、スライドバッファ内の文字列から、圧縮対象となる文字列と同じ文字列を速やかに検索する必要がある。そのための技術として、スライドバッファ内の文字列の出現位置をルックアップテーブル(辞書)に登録することが知られている。すなわち、ルックアップテーブルに登録された情報を用いて、スライドバッファ内に存在する同じ文字列を検索する。
図15では、スライドバッファ内のABで始まる文字列の先頭位置(文字Aの位置)のアドレスポインタが、辞書として機能するルックアップテーブル(以下、LUTという)1501内のABのアドレスを保存する位置に書き込まれている様子を示している。これによれば、1回のルックアップテーブルの参照で、ABから始まるスライドバッファ内の文字列の位置を知ることができる。
ここで、1文字が1バイトとすると、図示の場合にはLUT1501には2文字の組合わせが格納されるわけであるから、2文字の組合わせは[0x00;0x00]から「0xff;0xff」(0xは16進数を示している)となるので、LUT1501へのエントリアドレスは16ビット必要となる。
ここで、検索対象文字列を2文字から3文字列に増やす場合を考える。この場合、上記の理由で、LUTへのエントリーアドレスは24ビット必要とする。すなわち、たった1文字増えるだけで、LUTの要素数は実に28(=256)倍になってしまう。
これに対して、上記メモリサイズを縮退するために、例えば参照文字列のハッシュ値をルックアップテーブルの参照情報(アドレス)として利用する方法なども知られている(特許文献1)。
上記特許文献1によれば、確かにルックアップテーブルの容量が大きくなることを、ある程度は抑制できるものの、「ハッシュ値の衝突」の問題は残る。
本発明は、上記問題に鑑みなされたものであり、固定サイズの辞書を用いながらも、より効率良く圧縮符号化することを可能にする技術を提供しようとするものである。
この課題を解決するため、例えば本発明の符号化装置は以下の構成を備える。すなわち、
文字列を符号化済みの文字列のアドレスを記憶する辞書を参照して符号化する符号化装置であって、
圧縮符号化するための文字列データを保持するバッファメモリと、
M個(Mは2以上)の文字の組み合わせ分のエントリアドレスに対応すると共に、各アドレス毎に、前記バッファメモリのアドレスを格納するためのN個(Nは2以上)の固定長のアドレス格納領域を有する固定サイズの辞書を記憶する記憶手段と、
圧縮符号化の開始に先立って、前記記憶手段に記憶された前記辞書の前記アドレス格納領域の全てに、無効アドレスデータを格納する初期化手段と、
前記バッファメモリ内の符号化対象文字列の先頭のM個の文字で表わされる文字列で求められたエントリアドレスで前記辞書をアクセスし、当該エントリアドレスにおけるN個のアドレス格納領域が有効/無効なアドレスのいずれを格納しているかを判定する判定手段と、
該判定手段で無効アドレスを格納しているアドレス格納領域が有ると判定された場合には、当該無効アドレスを格納しているアドレス格納領域に前記符号化対象文字列の先頭文字のアドレスを登録し、
前記判定手段で無効アドレスを格納しているアドレス格納領域が無いと判定された場合には、有効なアドレスを格納しているアドレス格納領域の1つに前記符号化対象文字列の先頭文字のアドレスを登録する登録手段と、
前記判定手段で有効なアドレスが格納されているアドレス格納領域が有ると判定した場合、有効なアドレスが格納されている各アドレス格納領域に格納されたアドレスが示す位置から、前記符号化対象文字列と一致する最長一致文字数を求め、前記符号化対象文字列から前記最長一致文字数となる文字列までのオフセットアドレス、及び、前記最長一致文字数とを符号化して符号化データを生成し、
前記判定手段で有効なアドレスを格納しているアドレス格納領域が無いと判定された場合、前記符号化対象文字列の先頭の1文字を符号化して符号化データを生成する符号化手段とを有する。
文字列を符号化済みの文字列のアドレスを記憶する辞書を参照して符号化する符号化装置であって、
圧縮符号化するための文字列データを保持するバッファメモリと、
M個(Mは2以上)の文字の組み合わせ分のエントリアドレスに対応すると共に、各アドレス毎に、前記バッファメモリのアドレスを格納するためのN個(Nは2以上)の固定長のアドレス格納領域を有する固定サイズの辞書を記憶する記憶手段と、
圧縮符号化の開始に先立って、前記記憶手段に記憶された前記辞書の前記アドレス格納領域の全てに、無効アドレスデータを格納する初期化手段と、
前記バッファメモリ内の符号化対象文字列の先頭のM個の文字で表わされる文字列で求められたエントリアドレスで前記辞書をアクセスし、当該エントリアドレスにおけるN個のアドレス格納領域が有効/無効なアドレスのいずれを格納しているかを判定する判定手段と、
該判定手段で無効アドレスを格納しているアドレス格納領域が有ると判定された場合には、当該無効アドレスを格納しているアドレス格納領域に前記符号化対象文字列の先頭文字のアドレスを登録し、
前記判定手段で無効アドレスを格納しているアドレス格納領域が無いと判定された場合には、有効なアドレスを格納しているアドレス格納領域の1つに前記符号化対象文字列の先頭文字のアドレスを登録する登録手段と、
前記判定手段で有効なアドレスが格納されているアドレス格納領域が有ると判定した場合、有効なアドレスが格納されている各アドレス格納領域に格納されたアドレスが示す位置から、前記符号化対象文字列と一致する最長一致文字数を求め、前記符号化対象文字列から前記最長一致文字数となる文字列までのオフセットアドレス、及び、前記最長一致文字数とを符号化して符号化データを生成し、
前記判定手段で有効なアドレスを格納しているアドレス格納領域が無いと判定された場合、前記符号化対象文字列の先頭の1文字を符号化して符号化データを生成する符号化手段とを有する。
本発明によれば、固定サイズの辞書を用いながらも、より効率良く圧縮符号化することが可能になる。
以下、添付図面に従って本発明に係る実施形態を詳細に説明する。なお、実施形態では、辞書型圧縮(辞書型符号化または、辞書型圧縮符号化とも呼ぶ)方式について説明する。以下の説明においては、簡単のため、LZ77圧縮法をベースとした考え方に基づいて説明することとする。よって説明するまでもなく、圧縮対象の文字列データは、バッファメモリ内における、以前に出現し、符号化済みとなった文字列の中の一致列を知ることによって、その「過去の文字列の位置および過去の文字列との一致長さ」を圧縮データとして出力することをベースとしていることに留意願いたい。
本実施形態では、ルックアップテーブル(LUT)を検索用の辞書として備えることになる。そして、この辞書はRAM等の記憶メモリに確保され、M個(Mは2以上)の文字で構成される文字列で表わし得るエントリアドレスとして機能し、各エントリアドレス毎にN個(Nは2以上)の固定長のアドレス格納領域として機能する記憶領域を有する固定サイズとする。実施形態では、M=2、すなわち、2文字分の文字列の組合せの種類に対応する1つのエントリアドレスに対し、3個の記憶領域が確保されているものとする。辞書内の各記憶領域には、「過去に同じ2文字の文字列が、バッファメモリ内のどこに存在していたか」を示す候補となる位置情報(アドレス情報)を格納することができる。
この候補数を大きくすると、「過去に同じ2文字の文字列が、どこに存在していたか」を示すアドレス情報をより多く保持できるため、圧縮対象文字の文字列と過去の文字列とが長い文字として一致する確率が上がる。その結果、圧縮対象文字(データ列)の圧縮率が向上することになる。
図1は、実施形態における検索テーブル用のLUT101とスライドバッファ100、格納されている候補アドレスの様子を示したものである。また、実施形態におけるLUT101は、先頭2文字に対する候補数を3つ格納するために、3つのフィールドを有する例を説明する。本実施形態での、各文字は8bitで構成されており、0x00〜0xFF(0xは16進数を表わす)の256種類の値を取り得る。スライドバッファ100内のデータのアドレスがLUT101に保存されている。図1は、スライドバッファ内において、0x0A0Bから始まる文字列のアドレスとして、フィールド102と103の2箇所のアドレスがLUT101に登録されている様子を示している。LUT101内の検索対象0x0A0Bに対応するフィールド102には候補1のアドレスが、フィールド103には候補2のアドレスが格納されている。また、0x0A0Bのアドレスの候補3として、3つ目のフィールドがあるが、現在のところは登録されておらず、未登録のフィールドであることが分かる値がそのフィールドに保存されている。従って、0x0A0Bから始まる文字列がスライドバッファ内に存在するかどうかは、「0x0A0B」が示すアドレス位置のフィールドを順に見ていくだけで判明することになる。以下、このようなLUTを使って、一致文字列を検索する方法について、図面を用いて説明する。
なお、後述するが、スライドバッファ100のサイズは32768[Byte]とする。LUT101の各フィールドには、このスライドバッファ100をバイト単位のアドレスのオフセットアドレスを格納することになるが、そのためには15ビット必要になる。ただし、上記のとおり未登録の状態をも表わす必要があるため、実施形態では、LUT101の各フィールドのサイズは16ビットとし、アドレスが未登録状態である場合には、16ビットで表わす最大値「65535」を格納するものとした。なお、これは一例であって、スライドバッファ内か否かで判定できるようにすれば良いので、他の値でも構わない。
図2(a)は、実施形態におけるデータ符号化装置の機能構成を表わすブロック図である。図示における制御部210は本装置を構成する各処理部の制御を司ることになる。
データ圧縮したい入力ファイル201が入力部202に入力される。入力部202は、入力ファイル201から適宜入力バッファ203にデータを読み込む。入力バッファ203はスライドバッファのサイズのちょうど2倍の大きさを持っている。本実施形態では、スライドバッファサイズを32768[Byte]とし、入力バッファ203はその倍の65536[Byte]であるものとする。
入力バッファ203内において、圧縮対象文字列の先頭を特定し、その先頭文字列を一致文字列検索部204に入力する。一致文字列検索部204は、検索テーブル用LUT205(図1のLUT101に対応)を使って入力バッファ203のスライドバッファに該当する部分に、一致文字列があるか検索する。また、一致文字列がある場合には、その一致長とオフセットを取得する。また、一致文字列検索部は、入力バッファ203のデータが更新された時には、検索テーブル用LUT205(以下、検索テーブルと略す)のデータも更新する。一致文字列検索部204は、一致文字列の有無、一致文字列がある場合にはその一致長とオフセット値を符号生成部206へ出力する。符号生成部206は一致文字列検索部204から受信したデータを元に符号データを生成、出力ファイル207へ出力する。
また、本実施形態での圧縮方法はZlib圧縮方式を用いるものとする。すなわち、Zlib圧縮において一致文字列を検索することを例に説明する。
また、後の説明を分かりやすくするために、図2(b)、(c)を用いて、入力バッファ203の使い方を簡単に説明する。詳細な説明は、後述する図3以降のフローチャートの説明の中で行う。
入力バッファ203には、スライドバッファ208の文字列と、その直後に続く圧縮対象文字列209との両方が必ず含まれる(図2(b)参照)。圧縮対象文字列と一致する文字列をスライドバッファ208内から検索する場合、その一致長として、zlibでは3〜258を有効範囲としている。したがって、入力バッファ内において、圧縮対象文字列209が、最長一致長の許容最大サイズ「258」未満になってしまう場合、入力バッファ203の後半部分(スライドバッファサイズ分)を入力バッファ203の先頭にコピー(移動)する。そして、その後ろに新たにデータを読み込む。係る点を示しているのが図2(c)である。したがって、入力バッファ203の終端がスライドバッファとして利用されることはない。
次に、本実施形態における圧縮方法について、図3のフローを用いて説明する。ステップS301では、入力ファイル201から入力部202を通して、入力バッファ203に、入力バッファサイズと同じデータ量のデータを読み込む。そして、その時に読み込めたサイズRbを取得する。本実施形態では、入力バッファのサイズが65536[Byte]である。たとえば、C言語のfread関数を使って、unsigned char型のデータを、65536個読み込むようにすれば、戻り値として、読み込めたバイト数が得られる。この戻り値をRbとすることができる。読み込めたサイズRbは、入力バッファ203内の有効バイト数を表すことになる。次に、ステップS302で、圧縮対象文字へのポインタPtを初期化する。本実施形態では、入力バッファ203内の先頭から何バイト目が圧縮対象文字なのかを表す値をPtとする。したがって、初期化ではPtにゼロを代入する。次に、ステップS303では、候補数Yを取得する。この候補数Yは、2文字の組合せに対して、いくつのアドレスを検索テーブル内に保持できるかを示す値である。本実施形態では、図1に示すようにフィールド数が3であるので、候補数Yを3とする。ステップS304では、符号化の開始に先立ち、検索用テーブルSTをRAM等のメモリに確保し、そして全ての候補(フィールド)に、初期値を代入し、初期化する。本実施形態では、検索用テーブルST内の各候補のサイズを16ビットとし、各候補には入力バッファ203の先頭から何バイト目かを示す値をアドレスとして格納するものとする。初期値としては、未登録を表わすため、先に示したように16ビットで表わす最大値の「65535」を用いる。この最大値「65535」が示すアドレスは、入力バッファ203の最後の文字の位置を示すことになるが、先に説明した理由により、最後の文字が符号化対象となることはないので、区別できる。つまり、値「65535」は無効アドレスデータと言うこともできる。
ステップS305では、一致文字列をスライドウィンドウ208内から検索し、その時の一致長とオフセットを取得する。一致文字列の検索方法については、後に、図4を用いて詳しく説明する。ステップS306では、現在の圧縮対象文字列の先頭文字のアドレスを検索テーブル205に登録する。この登録方法については、後に図5を用いて詳しく説明する。
ステップS307では、一致文字列があったかどうかを判断する。この判断は、ステップS305で取得した一致長が最短一致長である3以上であったかどうかで判断する。ステップS307で一致文字列があったと判断された場合には、ステップS308へ進み、そうでなければ、ステップS309へ進む。ステップS308では、一致長とオフセットをzlib圧縮に規定されている方法でハフマン圧縮(ハフマン符号化とも呼ぶ)する。
一方、一致文字列がなかった場合、ステップS309にて、検索対象の先頭の1文字を出力し、zlib圧縮に規定されている方法で圧縮する。ステップS308、S309の圧縮については、本発明の主眼ではないので、詳しい説明を割愛する。
次に、ステップS310では、圧縮対象文字へのポインタPtに、圧縮された文字数を足して、Ptを更新する。すなわち、ステップS308で圧縮された一致長、または、S309で圧縮された1文字分の「1」を、Ptに加えることで、その値を更新する。この結果、次の圧縮対象文字列の先頭アドレスがPtに保持されることになる。
ステップS311では、圧縮が終了したかどうか判断する。本実施形態では、ポインタPtが、入力バッファ203における有効バイト数Rb以上になったかどうかで判断する。圧縮が終了した場合はこのフローを終了する。まだ、圧縮が終了していない場合には、ステップS312へ進む。ステップS312では、入力バッファ203のデータ容量が不足しているか判断する。すなわち、スライドバッファ208より後にあるデータのバイト数と、最長一致長である「258」を比較し、「258」未満であれば不足と判断し、ステップS313へ進む。そうでなければ、ステップS305へ処理を戻し、次の圧縮対象文字列に対する一致文字列の検索を行う。ステップS313に処理が進んだ場合、入力バッファの更新を行う。入力バッファ203の更新については、後に、図6を用いて詳しく説明する。
次に、上記ステップS305の一致文字列の検索処理を図4のフローチャートに従って説明する。本実施形態での一致文字列の検索は、一致長が最も長いもので、かつ、圧縮対象文字列に一番近いものを優先的に出力する。詳しいフローをステップS401から順に説明する。
ステップS401では、圧縮対象文字へのポインタPtを取得し、符号化対象文字列の先頭の2文字Ch0,Ch1を取得する。ここでは、簡単のため、1文字目のCh0が“0x0A”,2文字目のCh1が“0x0B”であったとする。ステップS402では、検索テーブル205内において先頭2文字Ch0,Ch1に対応する配列の先頭ポインタpWkを取得する。
検索テーブル205の先頭アドレスをST[0]とし、候補の数Yとすると、2文字が表わす検索テーブル205の該当する配列へのアクセスするためのアドレスポインタpWkは、
PWk=ST[0]+{Ch0×256+Ch1}×Y
となる(1文字目に256を乗算するのは、上位に8ビットシフトすることと等価)。本実施形態の場合、1つのアドレスに格納する候補の数は3つであるので、
pWk=ST[0]+{0x0A×256+0x0B}×3
=ST[0]+7713
=ST[7713]
PWk=ST[0]+{Ch0×256+Ch1}×Y
となる(1文字目に256を乗算するのは、上位に8ビットシフトすることと等価)。本実施形態の場合、1つのアドレスに格納する候補の数は3つであるので、
pWk=ST[0]+{0x0A×256+0x0B}×3
=ST[0]+7713
=ST[7713]
つまり、検索テーブル205の先頭から、7713番目のテーブル要素が、0x0A,0x0Bから始まる文字列に該当する配列のエントリアドレスである。なお、実施形態の場合、1つのテーブル要素(候補を示すアドレス情報)は先に説明したように16ビットである。
ステップS403では、候補数用のカウンタi、候補の中で最も長い文字列が一致した時の一致文字数を格納する変数maxMatch,その時のオフセットを格納する変数mOffにそれぞれゼロを代入して初期化する。
ステップS404では、pWk[i]に入っているアドレス値が初期値であるかどうか、又は、有効/無効の判定を行う。初期値(又は無効)の場合は、pWk[i]には有効な候補アドレスがないものとし、ステップS413へ進む。初期値以外の値が格納されていた場合には、pWk[i]には有効な候補アドレスが入っていると判断し、ステップS405へ進む。本実施形態では初期値として65535を用いているので、pWk[i]の値を65535と比較すればよい(pWk[i]<65535の場合、有効な候補アドレスが格納されていると判定する)。
ステップS405では、pWk[i]がスライドバッファ内であるかどうかを判断する。スライドバッファ内であると判断した場合は、有効な候補アドレスとしてステップS406へ処理を進める。スライドバッファの外であると判断した場合には、無効な候補アドレスとしてステップS409へ進む。本実施形態の場合には、pWk[i]は入力バッファ203の先頭から何バイト目かを表わす値が入っている。
圧縮対象文字へのポインタPtも、同じく入力バッファ203の先頭から何バイト目かを表す値が入っている。そこで、「Pt−pWk[i]」がスライドバッファのサイズ「32768」以下であれば、スライドバッファ内にあると判断し、ステップS406へ進み。そうでなければ、スライドバッファの外と判断し、ステップS409へ進む。
ステップS409では、pWk[i]に格納されている値は、既にスライドバッファの外に出てしまっている。つまり、検索範囲から外れてしまっているので、pWk[i]に初期値(65535)を代入し、検索テーブルの候補から外し、ステップS413へ処理を進める。
ステップS406では、入力バッファ203内のアドレスpWk[i]から始まる文字列と圧縮対象文字とを一文字ずつ比較し、一致長mLenを取得する。ただし、検索テーブルから、先頭2文字が一致していることは既に分かっている。したがって、実際には、mLenに2を代入しておき、入力バッファの先頭から(pWk[i]+2)番目からのデータ列と、入力バッファの先頭から(Pt+2)番目から始まるデータ列とを一文字ずつ比較すればよい。一致していれば、mLenを1増やして、次の文字の比較を行い、一致しなくなるか、または、最大一致長「258」まで比較を繰り返すことになる。ステップS407では、ステップS406で得られた一致長mLenを最短一致長「3」と比較する。3以上であればステップS408へ進む。3未満であれば、圧縮対象として無効な一致長であるため、処理をステップS413へ進める。
ステップS408では、ステップS406で取得した一致長mLenと、今回の検索における最長一致文字数maxMatchとを比較する。maxMatchよりもmLenが大きければ、ステップS412へ進む。そうでなければ、ステップS410へ進む。
ステップS412に処理が進んだ場合、maxMatchmLenとpWk[i]を、今回の一致文字列検索の出力候補とし、処理をステップS412へ進める。すなわち、maxMatchにmLenを代入して更新し、mOffにpWk[i]を代入して更新する。ステップS410では、maxMatchとmLenが等しいかどうかを見る。等しくない場合には、ステップS413へ進み、等しい場合には、ステップS411へ進む。
ステップS411では、pWk[i]が、現在一致候補として登録されている文字列までのオフセットmOffと比較して、圧縮対象文字列に近いか、遠いか判断する。遠い場合は、一致文字列候補とならないため、ステップS413へ進む。近い場合には、一致文字列候補となるため、ステップS412へ進む。具体的には、pWk[i]よりmOffが小さい場合には、pWk[i]の方が圧縮文字列に近いと判断できる。逆に、pWk[i]よりmOffが大きい場合には、mOffの方が圧縮文字列に近いと判断できる。ステップS413では、候補をカウントするカウンタiを一つインクリメントする。
ステップS414では、カウンタiが候補数Yと等しいかどうかを判断する。等しければ、ポインタPtで表わされる2文字に対する全ての候補について検索し終えたと判断し、このフローを終了する。等しくなければ、まだ、検索すべき候補が残っていると判断し、処理をステップS404へ戻す。
このフロー終了時には、一致長としてmaxMatchを、そのオフセットとしてmOffが出力される。したがって、一致文字列が見つからなかった場合、一致長としてゼロが出力される。有効な一致文字列が見つかった場合には、3以上の値が返される。
次に、図3のステップS306の処理、すなわち、圧縮対象文字列を、次の検索のために検索テーブル205に登録する処理について説明する。本実施形態では、以下のルールに則って登録する。
ルール1:候補となるアドレスを格納する配列(フィールド)の中に、初期値(=65535)が入っている配列があれば、その配列に登録する。
ルール2:初期値が入っている配列がなければ、今回の検索により最長一致文字列を発見した配列に上書き登録する。
ルール3:最長一致文字列が複数存在した場合(3文字目が一致するものが一つもない場合も含む)、その中で今回の圧縮対象文字列から一番遠い位置情報(格納されているアドレスが最も小さい値)を格納している配列に上書き登録する。
ルール1:候補となるアドレスを格納する配列(フィールド)の中に、初期値(=65535)が入っている配列があれば、その配列に登録する。
ルール2:初期値が入っている配列がなければ、今回の検索により最長一致文字列を発見した配列に上書き登録する。
ルール3:最長一致文字列が複数存在した場合(3文字目が一致するものが一つもない場合も含む)、その中で今回の圧縮対象文字列から一番遠い位置情報(格納されているアドレスが最も小さい値)を格納している配列に上書き登録する。
次に、上記のルールに従った図3のS306の登録方法について、図5のフローを用いて説明する。
ステップS501では、検索対象文字の先頭2文字(Ch0,Ch1)に対応する、検索テーブル内のY個の配列に、初期値が設定されている配列があるかどうかを調べる。
該当する配列の先頭は、図4のステップS402と同様の方法で、Ch0,Ch1に対応する検索テーブル内の配列の先頭を取得できる。また、先頭配列に続く配列の値を、先頭配列を含めてY個見ることで、その中に初期値が設定されているものがあるか、判断できる。初期値が設定されている配列がある場合には、ステップS502へ進み、なければ、ステップS503へ進む。
ステップS502では、初期値が設定されている配列pWk[k]を取得する。実施形態では、候補数(フィールド数)Yが3であるので、kは{i,i+1,i+2}のいずれかとなる。
その後、ステップS506にて、更新対象のpWk[k]が示す配列(フィールド)に、検索対象文字のアドレスPtを代入(格納)することで、登録作業を終了する。
ステップS503へ進んだ場合、S501で調べたY個の配列の中に、一致長がmaxMatchとなるオフセットが複数あるかどうかを調べる。複数ある場合には、ステップS504へ進み、なければステップS505へ進む。
ステップS504では、一致長がmaxMatchとなるオフセットの中で、今回検索対象とした文字から、一番遠いオフセットが格納されている配列pWk[k]を取得する。具体的には、オフセット同士を比較し、一番小さい値のものが、一番遠いオフセットと判断できる。その後、ステップS506へ進む。
ステップS505へ進んだ場合は、一致長がmaxMatchとなる配列pWk[k]を取得し、ステップS506へ進む。
本実施形態では、説明を分かりやすくするために、一致文字列の検索のフロー(図4)と、検索対象文字列の検索テーブルへの登録のフロー(図5)を分けて記述し、説明した。しかし、この二つのフローには、重複する部分も多くあることが容易に分かる。そのため、一致文字列の検索と、検索対象文字列を登録する配列の特定を同時に行う方が好ましい。
次に、入力バッファ203の更新方法について、図6のフローを用いて説明する。
ステップS601では、入力バッファ203において、圧縮対象文字へのポインタPtより後に最大一致長「258」以上のデータがあるか判断する。最大一致長以上のデータが無ければステップS602へ進み、そうでなければ、更新の必要はないと判断し、このフローを終了する。本実施形態では、圧縮対象文字へのポインタPtは、入力バッファ203内の先頭からのオフセットで表している。そのため、「Pt+258」と、入力バッファ203の有効データの終端(入力バッファ203への読み込みサイズRb)を比較し、「Pt+258」の方が大きければ、ステップS602へ進む。
ステップS602では、入力バッファ203の有効バイト数RbとスライドバッファサイズSbsを比較する。Rbの方が大きければステップS603へ進む。そうでなければ、ステップS606へ進む。
ステップS603では、入力バッファ内の「Sbs+1」番目以降のデータ(入力バッファを2分割した場合の後半)を入力バッファ203の先頭にコピーする(図2(c)参照)。ステップS604では、入力バッファ203の有効バイト数Rbから、スライドバッファサイズSbsを引いて、有効バイト数Rbを更新する。ステップS605では、入力バッファ後半部分のデータを前半部分にコピーしたことを検索テーブルSTの値にも反映させるため、検索テーブルSTを更新する。この更新方法については、後に図7を用いて説明する。
ステップS606では、入力バッファの(Rb+1)バイト目以降に、最大(入力バッファサイズ−Rb)バイトのデータを、入力ファイル201から読み込む。そして、読み込めたバイト数をRbに加算して、新たな入力バッファの有効バイト数とし、このフローを終了する。
次に、図7を用いてステップS605の検索用テーブルSTの更新方法について説明する。
ステップS701では、検索用テーブルSTの配列の個数Nを算出する。Nは、「先頭2文字の組合せ数」x「候補数」で計算できる。本実施形態の場合、N=196608(=256×256×3)となる。
ステップS702では、検索テーブル内の配列カウンタjにゼロを代入して初期化する。ステップS703では、検索テーブルST[j]の値が初期値以外かどうかを判定する。初期値以外ならステップS704へ進み、初期であればステップS707へ進む。
ステップS704では、ST[j]の値とスライドバッファサイズSbsを比較する。ST[j]がSbs以上であれば、ステップS705へ進み、そうでなければ、ステップS706へ進む。
ST[j]がSbs以上である場合、スライドバッファサイズ分だけスライドしても、更新後のアドレスは有効である。従って、ステップS705では、ST[j]からスライドバッファサイズSbsを引いた値を、新しいST[j]として更新する。
一方、ステップS706に進んだ場合には、ST[j]には初期値を代入して候補から外す。
また、ステップS707では、カウンタjに1足して、インクリメントする。そして、ステップS708では、カウンタjと検索テーブルSTの配列の個数Nを比較する。カウンタjと配列の個数Nが等しければ、全ての配列について更新し終えたと判断し、このフローを終了する。そうでなければ、処理をステップS703へ戻し、次の配列の更新処理に入る。
上記で説明したような本実施形態によれば、検索対象の2文字のエントリアドレス位置に複数個(実施形態では3個)の、一致する文字列のオフセットが格納されることになるので、スライドバッファ内において、検索対象文字列で始まる、より長い文字列の位置がヒットする確率を高めることができ、結果的に高速に、しかもより高い圧縮率で符号化データを生成できるようになる。しかも、検索テーブルのサイズは固定としているので、設計も容易になる。また、検索テーブルから登録データを削除するのも、値を初期値に変えるだけで済む。そのため、検索テーブルのメンテナンスも容易である。
なお、本実施形態では、最長一致であるかどうかだけを、一致列文字列として取得する際の条件としていたが、オフセットの情報を加味しても良い。例えば、直前の一致長3文字のものと、スライドバッファの先頭に位置する一致長4文字のものがある場合、本実施形態では、スライドバッファの先頭が一致文字列として取得される。
しかし、非常に遠いオフセット情報は、しばしば符号長が長くなることが知られている。そこで、オフセットに閾値を設けて、その閾値よりも遠いオフセットの文字列を、一致文字列として取得する際には、予め決められた以上の一致長が認められた時のみ、一致文字列として採用しても良い。複数の一致文字列候補を持ち、それぞれの符号を一度生成した後、最も符号長が短くなるオフセットと一致長の組合せを選択するようにしても良い。
[実施形態のオプション1]
<未使用配列があるときのみ、登録文字単位ごとにデータを登録する>
上述の実施形態では、検索テーブル205に登録されるアドレスは、圧縮された文字列の先頭位置のみになる。したがって、一致文字列が見つからなかった圧縮対象文字の場合には、その文字の位置が検索テーブル205に登録される。
<未使用配列があるときのみ、登録文字単位ごとにデータを登録する>
上述の実施形態では、検索テーブル205に登録されるアドレスは、圧縮された文字列の先頭位置のみになる。したがって、一致文字列が見つからなかった圧縮対象文字の場合には、その文字の位置が検索テーブル205に登録される。
一方、一致文字列が見つかった場合には、その圧縮対象の先頭のみの登録であり、その次に登録されるのは、一致文字長先のデータである。つまり、285文字の一致文字列が見つかった場合、その285文字の先頭のアドレスが格納されるものの、その次に登録されるのは、286文字目以降のアドレスになる。換言すれば、もし285文字の一致文字列が見つかった場合、その285文字の途中の文字列のアドレスは登録対象とはならない。
そこで、本オプション1では、圧縮対象文字列の先頭以外に対して、一致文字列が見つかった範囲の文字をp文字ごとに区切って、検索テーブルに登録する(以下、pを登録文字単位と呼ぶ)。p=1であれば、一致文字列が見つかった全てのデータを検索テーブルに登録することになる。pが3以上の値であれば、最短一致長のものは先頭位置のみ登録され、最短一致長よりも長い一致が見つかった場合のみ、先頭位置以外のデータも検索テーブルに登録されることになる。
以下、フローチャートを用いて、本オプション1の説明をする。本実施形態では、一致文字列を2文字ごと(p=2)に登録するものとする。また、その登録方法は、登録データに該当する配列に、初期値が入っている配列がある場合のみ、登録する。
先頭文字以外の登録は、第1の実施形態で説明した、圧縮対象文字の登録フローの最後に行えばよい。その様子を図8に示す。図8において、図5と同じステップには同じ番号が振ってある。第1の実施形態では、ステップS506でこのフローを終了したが、本オプションでは、その後に引き続きステップS801に進む。ステップS801では、圧縮対象文字の先頭以外の登録を行う。
このステップS801の登録処理の詳細を図9のフローチャートに従い説明する。
ステップS901では、検索の結果、圧縮対象文字列が一致した長さを取得する。これはステップS305で取得した一致長と同じであり、図4の一致文字列検索フローが出力するmaxMatchである。本フローでは一致長をmaxMatchと表す。ステップS902では、登録文字単位pを取得する。本実施形態ではp=2である。ステップS903では、圧縮対象文字列の先頭以外の登録文字の位置rpに、登録文字単位pを代入し、初期化する。圧縮対象文字列の第1番目、第2番目のアドレスは既に登録済みであるので、rpを3番目の文字を示すように設定すると言うこともできる。
ステップS904では、rpとmaxMatchを比較する。rpが小さければ、ステップS905へ進む。rpがmaxMatch以上の場合には、登録し終えたものと判定し、本処理を終了する。
ステップS905では、圧縮対象文字列内のrpから示される2文字Chp0,Chp1を取得する。すなわち、Chp0は入力バッファ先頭から「Pt+rp」番目のデータであり、Chp1は「Pt+rp+1」番目のデータである。ステップS906では、検索テーブルST内の「Chp0,Chp1」に対応する配列の先頭ポインタpWkを取得する。pWkは、ステップS402と同様の算出方法で取得できる。
ステップS907では、「Chp0,Chp1」に対応する配列を参照するためのカウンタiにゼロを代入して、初期化する。ステップS908では、pWk[i]の値と初期値と比較する。初期値と同じであれば、その配列pWk[i]は未使用であると判断しステップS909へ進む。初期値と異なる値であれば、その配列pWk[i]は使用されていると判断して、ステップS910へ進む。
ステップS909では、pWk[i]に「Chp0,Chp1」から始まる文字列の位置(Pt+rp)を代入し、ステップS912へ進む。ステップS912では、登録文字位置rpに登録文字単位pを加え、次の登録文字の位置を算出し、ステップS904へ処理を戻す。
一方、ステップS910に処理を進めた場合には、配列参照用カウンタiに1を加えて、次の配列を参照するようにする。ステップS911では、カウンタiが候補数Y(実施形態ではY=3)と等しいかを調べる。等しい場合には、候補数Y全ての配列を見終えたものとし、ステップS912へ進む。すなわち、「Chp0,Chp1」に対応する配列には、未使用の配列が無かったため、登録せずに、次の登録文字へと処理を進める。ステップS911において、カウンタiが候補数Yが異なる場合には、ステップS908へ処理を進める。
上記をまとめると、最長一致数Xで表わされる最長一致文字列を構成する文字をCh(0),Ch(1),…,Ch(X-1)と表わし、文字間隔をPとしたとき、
{Ch(P),Ch(P+1),…, Ch(P+M-1)}
{Ch(2P),Ch(2P+1),…, Ch(2P+M-1)}
{Ch(3P),Ch(3P+1),…, Ch(3P+M-1)}
:
で表わされる、各文字列の出現アドレスを、検索テーブル205に登録することを意味する。この結果、入力バッファ203の残り容量が少なくなって、スライドバッファ208が一気にシフトしたとても、検索テーブル205には有効なアドレスが残る確率が高くなり、効率の良い符号化処理を継続できる。
{Ch(P),Ch(P+1),…, Ch(P+M-1)}
{Ch(2P),Ch(2P+1),…, Ch(2P+M-1)}
{Ch(3P),Ch(3P+1),…, Ch(3P+M-1)}
:
で表わされる、各文字列の出現アドレスを、検索テーブル205に登録することを意味する。この結果、入力バッファ203の残り容量が少なくなって、スライドバッファ208が一気にシフトしたとても、検索テーブル205には有効なアドレスが残る確率が高くなり、効率の良い符号化処理を継続できる。
以上説明したように、本オプションを加えると、処理時間は上記第1の実施形態より長くなるが、検索テーブルへの登録文字が増えるため、その後の検索により一致する確率が高くなり、高い圧縮率が期待できる。
また、オプションを加えない場合には未使用だった配列にデータを登録することになり、検索テーブルの使用率があがり、より有効に検索テーブルのメモリ容量を使用できる、というメリットもある。なお、上記ではp=2の例を説明したが、この値はユーザが適宜変更できるようにしても良い。
[実施形態のオプション2]
<未使用配列がない場合、一番遠い位置のデータに上書きする>
オプション2では、符号対象文字列の先頭文字以外の登録時に、未使用配列がない場合には、一番遠い位置情報が保存されている配列を上書きする。
<未使用配列がない場合、一番遠い位置のデータに上書きする>
オプション2では、符号対象文字列の先頭文字以外の登録時に、未使用配列がない場合には、一番遠い位置情報が保存されている配列を上書きする。
上記オプション1と異なるのは、圧縮対象文字列の先頭以外の登録部分のみである。そこで、圧縮対象文字列の先頭以外の登録方法について、図10を用いて説明する。ただし、図9と同じ動作のステップには、図9と同じ番号を付し、詳しい説明は割愛する。
ステップS901からステップS907は、上記オプション1と同様の動作をする。ステップS1001では、候補配列の中の位置情報を一時的に記憶しておくための変数offsetを、圧縮対象文字列の先頭位置の値Ptで初期化し、ステップS908へ進む。ステップS908では、pWk[i]の値と初期値とを比較する。
pWk[i]に初期値が入っていれば、ステップS909へ進み、その後の処理は、オプション1と同様になる。初期値と異なる値が入っている場合には、ステップS1002へ進む。ステップS1002では、pWk[i]と変数offsetの値を比較する。pWk[i]の値がoffsetより小さければ、すなわち、変数offsetの値よりも遠い位置を示している場合にはステップS1003へ進む。そうでなければ、ステップS910へ処理を進める。
ステップS1003では、変数offsetにpWk[i]の値を代入し、その時のカウンタiの値を、上書き候補の配列番号dとして保存し、ステップS910へ進む。ステップS910ではカウンタiを一つインクリメントする。
ステップS911では、カウンタiと候補数Yと比較する。カウンタiと候補数Yが同じであればステップS1004へ進み、そうでなければ、ステップS908へ進む。ステップS1004では、未使用の配列が無かったと判断し、最終的に上書き候補となった配列pWk[d]にChp0,Chp1から始まる文字列の位置(Pt+rp)を代入し、ステップS912へ進む。
以上説明したように、本オプション2を加えると、オプション1よりも更に処理時間は長くなるものの、検索テーブルの位置情報がオプション1に比べて、より近い位置情報に書き換わる。zlib圧縮の場合、位置情報もハフマン圧縮するが、より近い位置の方が頻繁に出現するため、符号列が短い傾向になる。そのため、検索テーブル内の情報が、オプション1よりもより近い情報を持つオプション2の方が、高い圧縮率が期待できる。
[実施形態のオプション3]
<先頭文字以外も、先頭文字と同じルールで検索テーブルへ登録する>
本オプション3では、符号対象文字列の先頭文字以外の登録時にも、一致長を算出する。そして、最も長く一致する文字列の中で、符号対象文字列から一番遠い位置情報が保存されている配列に、そのアドレスで上書きする。
<先頭文字以外も、先頭文字と同じルールで検索テーブルへ登録する>
本オプション3では、符号対象文字列の先頭文字以外の登録時にも、一致長を算出する。そして、最も長く一致する文字列の中で、符号対象文字列から一番遠い位置情報が保存されている配列に、そのアドレスで上書きする。
上記オプション1、2と異なるのは、圧縮対象文字列の先頭以外の登録部分のみである。そこで、圧縮対象文字列の先頭以外の登録方法について、図11を用いて説明する。ただし、図9や図10と同じ動作のステップには、それぞれ図9、図10と同じ番号を付し、詳しい説明は割愛する。
ステップS901からステップS907までは上記オプション1と同様の動作をする。ステップS1101では、上書き候補となる配列に格納されている位置を保存するための変数offsetにPtを、また、その一致長を保存する変数maxlenにゼロを代入して初期化する。
ステップS908では、オプション1と同様にpWk[i]の値と初期値を比較する。初期値であれば、ステップS909、ステップS912、ステップS904と処理を進める。これらの処理はオプション1のそれぞれのステップと同様である。
ステップS908で、pWk[i]の値が初期値と異なる値であればステップS1102へ進む。ステップS1102では、登録文字位置rpから始まる登録文字列と、アドレスpWk[i]から始まる文字列を比較し、一致長lenを算出する。
一致長の算出方法は、ステップS406と同様の動作であるので、ここでの詳しい説明は割愛する。ステップS1103では、ステップS1102で算出した一致長lenと、上書き候補となる配列の位置からの一致長maxlenを比較する。lenの方が大きければステップS1104へ、そうでなければ、ステップS1105へ進む。
ステップS1104では、maxlenにlenを代入し、ステップS1003へ進む。ステップS1003では、オプション2と同様の動作であり、offsetにpWk[i]を、上書き候補番号dとしてiを代入しステップS910へ進む。
ステップS1105では、lenとmaxlenが同じ長さであるか比較する。同じ長さであれば、ステップS1002へ進む。異なる値であれば、ステップS1106へ進む。ステップS1106では、maxlenと最短一致長を比較する。
本実施形態では最短一致長は3であるので、maxlenが3以上であれば、既に一致文字列が見つかっているので、ステップS910へ進み、次の配列に進む。maxlenが3未満であれば一致文字列は見つかっていないため、一番遠いオフセットを持つ配列を探すため、ステップS1002へ進む。
ステップS1002では、オプション2と同様にpWk[i]とoffsetを比較する。offsetの方が小さければ、i番目の配列より現在の上書き候補の配列の方が遠い位置情報であるためステップS910へ進む。
offsetの方が大きければ、i番目の配列を上書き候補とするためにステップS1003へ進む。ステップS1003はオプション2と同様の動作である。ステップS910はカウンタiを一つインクリメントする。
ステップS911では、カウンタiと候補数Y(本実施形態では3)を比較し、異なる値であれば、ステップS908へ処理を戻す。同じであれば、ステップS1004へ進む。ステップS1004では、上書き候補番号dの配列pWk[d]に登録文字位置(Pt+rp)を登録し、ステップS912へ進み、次の登録文字位置について、同様の動作を繰り返す。
以上説明したように、本オプション3を加えると、オプション2よりも更に処理時間は長くなるが、一致文字列を優先的に上書きすることができる。すなわち、オプション2の場合には、距離しかみていなかったために、登録の結果、候補全てが同一の3文字から始まるデータになる可能性がある。それに対して、本オプション3では、一致長をみることで、候補の3文字目以降のデータに多様性が生まれ、その後の一致文字列検索の際に、より多くの一致文字列を見つけることができる。したがって、オプション2よりもさらに高い圧縮率が期待できる。
[実施形態の変形例]
以上説明した実施形態によれば、検索テーブル内の候補数Yを変えることで、圧縮率と処理時間、あるいは、圧縮率と使用メモリ容量を調整することが可能である。
以上説明した実施形態によれば、検索テーブル内の候補数Yを変えることで、圧縮率と処理時間、あるいは、圧縮率と使用メモリ容量を調整することが可能である。
また、検索テーブルへのデータ登録方法について、オプション1〜3を切り替えることでも、圧縮率と処理時間を調整することが可能である。また、登録文字単位を小さくすると時間はかかるが、長い一致文字列の間の文字も細かく検索テーブルに登録できるため、圧縮率の向上が図れる。
以上を踏まえて、たとえば、圧縮率と処理時間・使用メモリ量の組合せを予めテーブルとして容易しておく。その上で、圧縮時のオプションとして、例えば圧縮度合いを0〜6の7レベルでユーザに選ばせ、それぞれのアルゴリズム、メモリ使用量で圧縮方法を適宜変えても良い。
図12(a)はこのテーブルの例を示している。同図の場合、圧縮率レベルを変えると使用メモリ量も変わってしまう。一方、圧縮アルゴリズムを組み込む機器によっては、固定のメモリ容量だけで、圧縮率レベルを変えたい、という要望もある。そのような場合には、図12(b)に示すように、候補数を変えずに、アルゴリズムと登録文字単位だけを変化させればよい。
また、システムによっては、使用メモリ量を可変にしても良いが、ある程度の速度は維持したいという要望もある。そのような場合は、図12(c)のようにオプションのアルゴリズムを使わずに、候補数のみを変えることで、圧縮率のレベルを変えても良い。図12(c)における、候補数1,2,4,6,8,12の時のLUTの様子を図13(a)〜(f)にそれぞれ示す。
図13に示すように、候補数が決まると、LUTのサイズが決まる。それぞれ固定長のメモリが2文字の組合せ順、候補順に並んでいるだけであるので、候補数が増えても、LUTのサイズは候補数に比例したサイズになるだけである。圧縮対象文字列が2文字から3文字にする場合には、テーブルサイズが28倍になることを考慮すると、この候補数の増加により要求されるメモリサイズによるデータ検索やデータの削除にかかる負荷はそれほど大きくならず、候補数を増やすことによる影響は少ないと言える。また、上記のオプションを加える、あるいは、その際の登録文字単位を変更するよりは、処理時間に与える影響も小さい。
さらに、図12(c)のように候補数を増やして、すべての候補を検索すると、やはり処理時間が長くなるため、ある程度の速度は維持したい、という要望に応えきれなくなることもある。そのような場合には、一致長にあるスレッショルド(たとえば、8文字)を設定し、候補を先頭から順に検索し、スレッショルド以上の一致長が見つかったら、それ以降の候補については検索しない、という処理を加えても良いであろう。
上記各実施形態によれば、3文字以上の長い文字列の一致を確認したい場合であっても、ハッシュ値などをルックアップテーブルの参照データとしなくとも十分に実用的なメモリ容量でルックアップテーブルを構成できることが理解できよう。また、過去の文字列を参照するためのルックアップテーブルとして、固定容量のメモリ領域を効果的に利用することにより、効率よく過去の文字列を検索することが可能である。特に、予め割り当てられた固定長メモリを利用するため、使用メモリ領域を逐次更新する等の煩雑なメモリ管理が不要である。
<その他の実施例)
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。
Claims (9)
- 文字列を符号化済みの文字列のアドレスを記憶する辞書を参照して符号化する符号化装置であって、
圧縮符号化するための文字列データを保持するバッファメモリと、
M個(Mは2以上)の文字の組み合わせ分のエントリアドレスに対応すると共に、各アドレス毎に、前記バッファメモリのアドレスを格納するためのN個(Nは2以上)の固定長のアドレス格納領域を有する固定サイズの辞書を記憶する記憶手段と、
圧縮符号化の開始に先立って、前記記憶手段に記憶された前記辞書の前記アドレス格納領域の全てに、無効アドレスデータを格納する初期化手段と、
前記バッファメモリ内の符号化対象文字列の先頭のM個の文字で表わされる文字列で求められたエントリアドレスで前記辞書をアクセスし、当該エントリアドレスにおけるN個のアドレス格納領域が有効/無効なアドレスのいずれを格納しているかを判定する判定手段と、
該判定手段で無効アドレスを格納しているアドレス格納領域が有ると判定された場合には、当該無効アドレスを格納しているアドレス格納領域に前記符号化対象文字列の先頭文字のアドレスを登録し、
前記判定手段で無効アドレスを格納しているアドレス格納領域が無いと判定された場合には、有効なアドレスを格納しているアドレス格納領域の1つに前記符号化対象文字列の先頭文字のアドレスを登録する登録手段と、
前記判定手段で有効なアドレスが格納されているアドレス格納領域が有ると判定した場合、有効なアドレスが格納されている各アドレス格納領域に格納されたアドレスが示す位置から、前記符号化対象文字列と一致する最長一致文字数を求め、前記符号化対象文字列から前記最長一致文字数となる文字列までのオフセットアドレス、及び、前記最長一致文字数とを符号化して符号化データを生成し、
前記判定手段で有効なアドレスを格納しているアドレス格納領域が無いと判定された場合、前記符号化対象文字列の先頭の1文字を符号化して符号化データを生成する符号化手段と
を有することを特徴とする符号化装置。 - 前記登録手段は、
前記判定手段で無効アドレスを格納しているアドレス格納領域が無いと判定された場合には、有効なアドレスを格納しているアドレス格納領域のうち、最長一致文字数となる文字列の先頭アドレスを格納していたアドレス格納領域に、前記符号化対象文字列の先頭文字のアドレスを登録し、最長一致文字数となる文字列の先頭アドレスが複数存在している場合には、前記符号化対象文字列から最も遠いアドレスを記憶しているアドレス格納領域に、前記符号化対象文字列の先頭文字のアドレスを登録する
ことを特徴とする請求項1に記載の符号化装置。 - 前記符号化手段は、
前記辞書のアドレス格納領域に格納されたアドレスのうち、前記符号化対象文字列の直前の位置から予め設定されたサイズ分のスライドバッファ内を指し示すアドレスを有効なアドレス、それ以外を無効なアドレスとして判定する
ことを特徴とする請求項1又は2に記載の符号化装置。 - 前記符号化対象文字列を符号化した結果、前記バッファメモリ内の未だ符号化されていない文字列のサイズが、前記符号化手段で符号化する一致長の許容最大サイズより少なくなった場合、前記バッファメモリの前記スライドバッファが示すサイズが示す位置よりも後のデータを前記バッファメモリの先頭に移動させ、移動により空いたメモリの領域に新たに符号化する対象の文字列データを読み出すと共に、前記辞書を更新する更新手段を有し、
前記更新手段は、
前記辞書内の全てのアドレス格納領域に格納されたアドレスから、前記スライドバッファのサイズを示すアドレスで減じることで前記辞書を更新する
ことを特徴とする請求項3に記載の符号化装置。 - 前記更新手段は、
前記符号化手段で符号化した最長一致数Xで表わされる最長一致文字列を構成する文字をCh(0),Ch(1),…,Ch(X-1)と表わしたとき、当該最長一致文字列における
{Ch(P),Ch(P+1),…, Ch(P+M-1)}
{Ch(P),Ch(2P+1),…, Ch(2P+M-1)}
{Ch(3P),Ch(3P+1),…, Ch(3P+M-1)}
:
で表わされる、各文字列のアドレスを、前記辞書の該当するアドレス格納領域に格納することを特徴とする請求項4に記載の符号化装置。 - 前記更新手段は、無効なアドレスを格納しているアドレス格納領域を更新対象とし、無効なアドレスを格納しているアドレス格納領域が無い場合には前記バッファメモリの先頭に近いアドレスを格納しているアドレス格納領域を更新対象として判定することを特徴とする請求項5に記載の符号化装置。
- 前記更新手段は、無効アドレスを格納しているアドレス格納領域が無いと判定された場合には、有効なアドレスを格納しているアドレス格納領域のうち、最長一致文字数となる文字列の先頭アドレスを格納していたアドレス格納領域を更新対象とすることを特徴とする請求項5に記載の符号化装置。
- 圧縮対象の文字列データを保持するバッファメモリと、M個(Mは2以上)の文字の組み合わせ分のエントリアドレスに対応すると共に、各アドレス毎に、前記バッファメモリのアドレスを格納するためのN個の固定長のアドレス格納領域を有する固定サイズの辞書を記憶する記憶手段とを有する符号化装置の制御方法であって、
初期化手段が、圧縮符号化の開始に先立って、前記記憶手段に記憶された前記辞書の前記アドレス格納領域の全てに、無効アドレスデータを格納する初期化工程と、
判定手段が、前記バッファメモリ内の符号化対象文字列の先頭のM個の文字で表わされる文字列で求められたエントリアドレスで前記辞書をアクセスし、当該エントリアドレスにおけるN個のアドレス格納領域が有効/無効なアドレスのいずれを格納しているかを判定する判定工程と、
登録手段が、
該判定工程で無効アドレスを格納しているアドレス格納領域が有ると判定された場合には、当該無効アドレスを格納しているアドレス格納領域に前記符号化対象文字列の先頭文字のアドレスを登録し、
前記判定工程で無効アドレスを格納しているアドレス格納領域が無いと判定された場合には、有効なアドレスを格納しているアドレス格納領域の1つに前記符号化対象文字列の先頭文字のアドレスを登録する登録工程と、
符号化手段が、
前記判定工程で有効なアドレスが格納されているアドレス格納領域が有ると判定した場合、有効なアドレスが格納されている各アドレス格納領域に格納されたアドレスが示す位置から、前記符号化対象文字列と一致する最長一致文字数を求め、前記符号化対象文字列から前記最長一致文字数となる文字列までのオフセットアドレス、及び、前記最長一致文字数とを符号化して符号化データを生成し、
前記判定工程で有効なアドレスを格納しているアドレス格納領域が無いと判定された場合、前記符号化対象文字列の先頭の1文字を符号化して符号化データを生成する符号化工程と
を有することを特徴とする符号化装置の制御方法。 - 圧縮対象の文字列データを保持するバッファメモリと、
M個(Mは2以上)の文字の組み合わせ分のエントリアドレスに対応すると共に、各アドレス毎に、前記バッファメモリのアドレスを格納するためのN個の固定長のアドレス格納領域を有する固定サイズの辞書を記憶する記憶手段と
を有するコンピュータに読み込ませ実行させることで、前記コンピュータに、請求項8に記載の方法の各工程を実行させるためのプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012242216A JP2014093612A (ja) | 2012-11-01 | 2012-11-01 | 符号化装置及びその制御方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2012242216A JP2014093612A (ja) | 2012-11-01 | 2012-11-01 | 符号化装置及びその制御方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2014093612A true JP2014093612A (ja) | 2014-05-19 |
Family
ID=50937421
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2012242216A Pending JP2014093612A (ja) | 2012-11-01 | 2012-11-01 | 符号化装置及びその制御方法 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2014093612A (ja) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016143994A (ja) * | 2015-01-30 | 2016-08-08 | 富士通株式会社 | 符号化プログラムおよび伸長プログラム |
JP2017022666A (ja) * | 2015-07-14 | 2017-01-26 | 富士通株式会社 | 圧縮プログラム、圧縮方法、情報処理装置、置換プログラムおよび置換方法 |
JP2018067781A (ja) * | 2016-10-18 | 2018-04-26 | 株式会社リコー | 符号化装置、プログラム、符号化方法 |
JP2021527376A (ja) * | 2018-06-06 | 2021-10-11 | ウー インクァンWU, Yingquan | データ圧縮 |
US11777518B2 (en) | 2021-09-09 | 2023-10-03 | Kioxia Corporation | Data compression device, memory system and method |
-
2012
- 2012-11-01 JP JP2012242216A patent/JP2014093612A/ja active Pending
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2016143994A (ja) * | 2015-01-30 | 2016-08-08 | 富士通株式会社 | 符号化プログラムおよび伸長プログラム |
JP2017022666A (ja) * | 2015-07-14 | 2017-01-26 | 富士通株式会社 | 圧縮プログラム、圧縮方法、情報処理装置、置換プログラムおよび置換方法 |
JP2018067781A (ja) * | 2016-10-18 | 2018-04-26 | 株式会社リコー | 符号化装置、プログラム、符号化方法 |
JP2021527376A (ja) * | 2018-06-06 | 2021-10-11 | ウー インクァンWU, Yingquan | データ圧縮 |
US11777518B2 (en) | 2021-09-09 | 2023-10-03 | Kioxia Corporation | Data compression device, memory system and method |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
KR102290835B1 (ko) | 유지관리 동작들을 위한 병합 트리 수정들 | |
TWI682274B (zh) | 鍵值儲存樹 | |
US10642515B2 (en) | Data storage method, electronic device, and computer non-volatile storage medium | |
JP2014093612A (ja) | 符号化装置及びその制御方法 | |
TW201837720A (zh) | 用於多串流儲存裝置之串流選擇 | |
CN103326732B (zh) | 压缩数据的方法、解压数据的方法、编码器和解码器 | |
TW201842454A (zh) | 合併樹廢棄項目指標 | |
TW201539187A (zh) | 快閃記憶體之壓縮、讀取方法及應用其方法的裝置 | |
JP2014534486A (ja) | スケーラブル・データ・デュプリケーションのための方法、システム、およびコンピュータ・プログラム | |
CN113961514B (zh) | 数据查询方法及装置 | |
JP2008071362A (ja) | データベース | |
WO2015139381A1 (zh) | 一种终端软件升级方法及装置 | |
JP2016170526A (ja) | 検索装置、検索方法、プログラム、及び記録媒体 | |
JP2019036810A (ja) | データ圧縮装置、データ復元装置、データ圧縮プログラム、データ復元プログラム、データ圧縮方法、およびデータ復元方法 | |
CN104584439B (zh) | 存储程序、存储方法、存储装置、解压缩程序、解压缩方法和解压缩装置 | |
KR20170040343A (ko) | 적응형 레이트 압축 해시 프로세싱 디바이스 | |
CN110457535A (zh) | 哈希桶查找方法、哈希表存储、哈希表查找方法和装置 | |
CN114817232A (zh) | 访问数据的方法及装置 | |
WO2017161589A1 (zh) | 一种字符串序列的压缩索引方法及装置 | |
CN113297156A (zh) | 一种数据同步方法、装置、设备及介质 | |
JP6032292B2 (ja) | 圧縮プログラム、圧縮装置、伸張プログラムおよび伸張装置 | |
CN111259203B (zh) | 数据压缩器以及数据压缩方法 | |
US20140340246A1 (en) | Efficient Processing of Huffman Encoded Data | |
CN108628762A (zh) | 多命名空间 | |
CN115577149A (zh) | 一种数据处理方法、装置、设备及可读存储介质 |