JP2014183551A - データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム - Google Patents

データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム Download PDF

Info

Publication number
JP2014183551A
JP2014183551A JP2013058644A JP2013058644A JP2014183551A JP 2014183551 A JP2014183551 A JP 2014183551A JP 2013058644 A JP2013058644 A JP 2013058644A JP 2013058644 A JP2013058644 A JP 2013058644A JP 2014183551 A JP2014183551 A JP 2014183551A
Authority
JP
Japan
Prior art keywords
symbol
symbol string
block
data
code
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
JP2013058644A
Other languages
English (en)
Other versions
JP6048251B2 (ja
Inventor
Nobuko Itani
宣子 井谷
Yasuhiko Nakano
泰彦 中野
Takumi Maruyama
拓巳 丸山
Ryuji Suga
竜二 菅
Shigeki Ito
成記 伊藤
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2013058644A priority Critical patent/JP6048251B2/ja
Priority to US14/180,436 priority patent/US20140289208A1/en
Publication of JP2014183551A publication Critical patent/JP2014183551A/ja
Application granted granted Critical
Publication of JP6048251B2 publication Critical patent/JP6048251B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/60General implementation details not specific to a particular type of compression
    • H03M7/6017Methods or arrangements to increase the throughput
    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/3084Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method
    • H03M7/3086Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method employing a sliding window, e.g. LZ77

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Abstract

【課題】データ復元の高速化を可能とする。
【解決手段】データ圧縮装置2の探索手段2aは、圧縮対象のデータ1を、データ1内の記号の配列を調査し、先に出現した第1の記号列1aと記号の配列が一致する第2の記号列1bを探索する。データ圧縮装置2の符号化手段2bは、第1の記号列1aの先頭の記号が属するブロックを特定する情報を含む符号に、第2の記号列1bを符号化する。データ復元装置4の符号取得手段4aは、圧縮データ3aの先頭から順に、符号を取得する。データ復元装置4の復元手段4bは、第2の記号列1bの符号を取得した場合には、第1の記号列1aの先頭の記号が属するブロックを特定する情報に基づいて、記憶手段5から、復元された第1の記号列1aの先頭の記号が属するブロック以降の1以上のブロックを取得し、第2の記号列1bを復元する。
【選択図】図1

Description

本発明は、データを圧縮するデータ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びに圧縮されたデータを復元するデータ復元装置、データ復元方法、およびデータ復元プログラムに関する。
コンピュータなどの装置でデータを格納する場合、格納するデータを圧縮することがある。格納するデータを圧縮すれば、データの格納に必要な記憶容量が削減され、格納先の記憶装置を効率良く使用することができる。また情報通信を行う装置においてデータを送信する場合にも、送信するデータを圧縮することがある。送信するデータを圧縮すれば、送信対象のデータ量が削減され、データ送信時間を短縮することができる。
データの圧縮技術には、大別して可逆(loss-less)圧縮と非可逆(lossy)圧縮とがある。可逆圧縮は、データの欠落を許さずにデータ量を減らす技術である。他方、非可逆圧縮は、データの欠落を許容することで、高い圧縮率でデータを圧縮する技術である。テキストやプログラムなどの多くのデータは、欠落が許容されず、可逆圧縮により圧縮される。
可逆圧縮技術の1つに、LZ(Lempel-Ziv)77符号と呼ばれる符号に圧縮する技術がある。LZ77符号では、何度も出現する記号列を、その記号列が過去に出現した位置と長さとを示す符号に符号化する。データを復元する際には、各符号が、その符号における位置と長さで特定される記号列に置き換えられる。
LZ77符号を改良して、パソコンなどのメモリイメージを圧縮してHDD(Hard Disk Drive)などの格納装置に格納するときの処理時間を改善する技術も考えられている。この技術では、パソコンなどの主記憶全体の内容を圧縮してHDDなどの格納装置に格納するとき、(CPU(Central Processing Unit)のワード長÷圧縮処理の処理単位長(=シンボル長))だけ離れたオフセットに対して最短のオフセット符号をアサインする。
また、少なくとも2つの異なるサイズのデータの繰り返しを用いて符号化・復号化することで、圧縮率を向上する技術も考えられている。
特開2001−092627号公報 特開2002−043950号公報
井谷 宣子,吉田 茂,「ロスレス圧縮の技術と特許 圧縮ソフト SLC/ELCのアルゴリズム」,C MAGAZINE,ソフトバンククリエイティブ,2004年9月18日,2004年10月号,pp.106−110
しかし、LZ77符号では、データの復元の際に、先に復元した記号列から、符号に対応する記号列を記号ごとに取得することになるため、メモリアクセス回数が多くなり、復元処理の高速化が妨げられている。例えば1つの記号が1バイトで表されていれば、1バイト単位でのメモリアクセスを繰り返し行うことで、符号に対応する記号列が取得される。メモリアクセスは、CPUのレジスタ内での操作に比べて時間がかかるため、メモリアクセスが多いことは、復元処理の長期化の原因となる。
なお、上記の説明では、LZ77符号に関する問題を指摘したが、符号化対象の記号列を過去に出現した記号列の出現位置と長さで符号化する他の符号化技術においても、同様の問題が生じている。例えばLZ77に改良を加えたLZSSでも、同様の問題が生じている。
1つの側面では、本発明は、データ復元の高速化を可能とすることを目的とする。
1つの案では、探索手段と符号化手段とを有するデータ圧縮装置が提供される。探索手段は、圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第1の記号列と記号の配列が一致する第2の記号列を探索する。符号化手段は、第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、第2の記号列を該符号に符号化する。
1態様によれば、データ復元の高速化が可能となる。
第1の実施の形態に係るシステムの機能構成例を示す図である。 本実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。 辞書と記号との対応付けを示す図である。 符号のデータ構造の一例を示す図である。 一致記号列がある場合の符号の一例を示す図である。 一致記号列がない場合の符号の一例を示す図である。 圧縮データの一例を示す図である。 データの圧縮・復元の機能を示すブロック図である。 圧縮処理の手順の一例を示すフローチャートである。 データ復元処理の手順の一例を示す図である。 レジスタ群を用いた復元手順の一例を示す図である。 レジスタを効率的に利用した圧縮処理の手順の一例を示すフローチャートである。 レジスタを効率的に利用した復元処理の手順の一例を示すフローチャートである。 圧縮データの一例を示す図である。
以下、本実施の形態について図面を参照して説明する。なお各実施の形態は、矛盾のない範囲で複数の実施の形態を組み合わせて実施することができる。
〔第1の実施の形態〕
まず、第1の実施の形態について説明する。第1の実施の形態は、圧縮されたデータの復元時に数バイト単位でメモリアクセスを行うことでメモリアクセス回数を低減し、復元速度を高速化するものである。例えばコンピュータは、長いデータ長単位でメモリアクセスを行うことで、処理を高速化することができる。特に最近のCPUが有するレジスタのサイズは、32ビット(4バイト)や64ビット(8バイト)が一般的となっており、長いサイズのデータをそのままレジスタに格納し、レジスタ内でコピーなどの操作を行うことが可能である。そこで1命令で複数データを扱うSIMD(Single Instruction Multiple Data)命令を用い、16バイトまたは32バイト単位でメモリのデータをレジスタにコピーすることで、データのコピーを高速に行うことができる。なおSIMD命令を有する命令セットには、例えばSSE(Streaming SIMD Extensions)がある。
ただし、高速なブロック単位でのコピー処理が行えるように、ブロック単位で記号(シンボル)の一致・不一致を判断したのでは、記号が一致する確率が低くなり、圧縮率低下を招いてしまう。そこで、第1の実施の形態では、記号列の一致・不一致は記号ごとに行いながらも、復元時のメモリアクセスをブロック単位で行えるような符号化を行う。
図1は、第1の実施の形態に係るシステムの機能構成例を示す図である。第1の実施の形態は、データ1の圧縮と復元を行うために、データ圧縮装置2、記録媒体3、データ復元装置4、および記憶手段5(メモリ)を有する。データ圧縮装置2は、データ1を圧縮し、圧縮後の圧縮データ3aを記録媒体3に保存する。データ復元装置4は、記録媒体3に保存された圧縮データ3aに基づいてデータ1を復元し、復元データ5aを記憶手段5に格納する。記憶手段5は、復元データ5aを記憶する。
データ圧縮装置2は、データ1を圧縮するために、探索手段2aと符号化手段2bとを有する。探索手段2aは、圧縮対象のデータ1を、2以上の記号を含む複数のブロック1−1,1−2,1−3に分ける。例えば復元処理を行うプロセッサにおいてメモリ間の高速データコピーを扱える単位を1ブロックとする。図1の例ではブロック1−1,1−2,1−3を太線で示しており、1つのブロックに8個の記号を含んでいる。1つ目のブロック1−1のアドレスを「0」、2つ目のブロック1−2のアドレスを「1」、3つ目のブロック1−3のアドレスを「2」とする。
そして探索手段2aは、データ1内の記号の配列を先頭から順に調査し、先に出現した第1の記号列1aと記号の配列が一致する第2の記号列1bを探索する。例えば探索手段2aは、データ1のうちの符号化済みの範囲から、未符号化の範囲の先頭の記号列と、できるだけ長く一致する同じ記号列を探索する。図1の例では、第2の記号列1bに対して、1ブロック前の2つ目の記号からの5つの記号「aaaaa」が一致している。ここで、符号化済みの範囲から見つかった記号列が第1の記号列1aとなり、未符号化の範囲における同じ記号配列の記号列が第2の記号列1bとなる。
符号化手段2bは、第1の記号列1aの先頭の記号が属するブロックを特定する情報を含む符号を生成し、第2の記号列1bをその符号に符号化する。例えば符号化手段2bは、第1の記号列1aの先頭の記号が属するブロック1−1のアドレス「0」と、第2の記号列1bの先頭の記号が属するブロック1−2のアドレス「1」との差分を計算する。この差分は、第1の記号列1aの先頭を、第2の記号列1bの先頭からの相対ブロック数で表したものである。そして符号化手段2bは、計算して得られた差分の値を、第1の記号列1aの先頭の記号が属するブロック1−1を特定する情報とする。
また符号化手段2bは、第1の記号列1aの先頭の記号のブロック内での位置を示す情報を、符号に含めてもよい。例えば符号化手段2bは、第1の記号列1aの先頭の記号のブロック内での位置と、第2の記号列1bの先頭の記号のブロック内での位置とのずれ量(シフトバイト数)を、第2の記号列1bの符号に含める。図1の例では、第1の記号列1aの先頭の記号は、ブロック1−1内の2つ目の記号であり、第2の記号列1bの先頭の記号は、ブロック1−2内の8つ目の記号である。そこで、ずれ量は「6」となる。
また符号化手段2bは、例えば第2の記号列1bの先頭の記号が属するブロック1−2のアドレス「1」と、第2の記号列1bの最後の記号が属するブロック1−3のアドレス「2」との差分(ストアブロック数)を、第2の記号列1bの符号に含めてもよい。図1の例では、差分は「1」となる。
また符号化手段2bは、例えば第2の記号列1bの最後の記号が属するブロック1−3の先頭から、そのブロック1−3内での、第2の記号列1bの最後の記号の位置までの差分(ストアバイト数)を、第2の記号列1bの符号に含めてもよい。図1の例では、第2の記号列1bの最後の記号は、ブロック1−3内の4つ目である。そこで、差分は「4」となる。
また符号化手段2bは、例えば先に調査した範囲に記号の配列が一致する記号列がない第3の記号列1cに基づいて、一致する記号列がないことを示す情報を含む符号を生成することもできる。この場合、例えば符号化手段2bは、第2の記号列1bの符号、第3の記号列1cの符号、および第3の記号列1cのコピーを含む圧縮データ3aを生成する。
また符号化手段2bは、例えば第3の記号列1cの先頭の記号の、データ1のブロック1−3内での位置と、圧縮データ3aを複数のブロックに分けたときの、第3の記号列1cのコピーの先頭の記号の、圧縮データ3aのブロック内での位置との差分を計算する。そして符号化手段2bは、計算した差分を第3の記号列1cの符号に含めてもよい。
また符号化手段2bは、例えば第3の記号列1cの先頭の記号が属するブロック1−3のアドレス「2」と、第3の記号列1cの最後の記号が属するブロック1−3のアドレス「2」との差分を、第3の記号列1cの符号に含めてもよい。
また符号化手段2bは、例えば第3の記号列1cの最後の記号が属するブロック1−3の先頭から、そのブロック1−3内での第3の記号列1cの最後の記号の位置までの差分を、第3の記号列1cの符号に含めてもよい。
データ復元装置4は、記録媒体3に格納された圧縮データ3aを復元するために、符号取得手段4aと復元手段4bとを有している。
符号取得手段4aは、圧縮データ3aの先頭から順に、符号を取得する。符号取得手段4aは、取得した符号を、復元手段4bに渡す。
復元手段4bは、取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段5に格納する。復元手段4bは、第2の記号列1bの符号を取得した場合には、第1の記号列1aの先頭の記号が属するブロックを特定する情報に基づいて、記憶手段5内の、復元された第1の記号列1aの先頭の記号が属するブロック以降の1以上のブロックを取得する。そして復元手段4bは、1以上のブロックから第1の記号列1aをコピーして、第2の記号列1bを復元する。
なお、第2の記号列1bの符号には、例えば、第1の記号列1aの先頭の記号が属するブロック1−1のアドレス「0」と、第2の記号列1bの先頭の記号が属するブロック1−2のアドレス「1」との差分を含めることができる。この差分が含まれる場合、復元手段4bは、復元した第2の記号列が属するブロックのアドレスよりも、第2の記号列1bの符号に示された差分だけ前のアドレスのブロック以降の1以上のブロックを、記憶手段5から取得する。
また第2の記号列1bの符号には、第1の記号列1aの先頭の記号のブロック内での位置と、第2の記号列1bの先頭の記号のブロック内での位置とのずれ量を含めることができる。この差分が含まれる場合、復元手段4bは、記憶手段5から取得したブロック内の第1の記号列の記号を、そのずれ量だけシフトして、直前に復元された記号列と結合する。
また第2の記号列1bの符号には、第2の記号列1bの先頭の記号が属するブロックのアドレスと、第2の記号列1bの最後の記号が属するブロックのアドレスとの差分を含めることができる。この差分が含まれる場合は、復元手段4bは、第2の記号列1bを復元したとき、その差分で示された数のブロックを記憶手段5に格納する。
また第2の記号列1bの符号には、第2の記号列1bの最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分を含めることができる。この差分が含まれる場合は、復元手段4bは、第2の記号列を復元したとき、復元された記号列の後方から、その差分で示された範囲の記号列を保持する。そして復元手段4bは、保持した記号列の後方に、次に取得した符号に基づいて復元した記号列を結合する。
また、圧縮データ3aには、先に調査した範囲に記号の配列が一致する記号列がない第3の記号列1cの符号と、第3の記号列1cのコピーとが含まれている。そこで復元手段4bは、第3の記号列1cの符号を取得すると、圧縮データ3aから、第3の記号列1cのコピーをブロック単位で取得する。そして復元手段4bは、取得したブロックから、第2の記号列1bの復元の場合と同様に、記号列のコピーなどの処理を行い、第3の記号列1cを復元する。
このようなシステムによれば、圧縮対象のデータ1における第2の記号列1bは、例えば4つの値に符号化される。1つ目の値は、第1の記号列1aの先頭の記号が属するブロック1−1のアドレス「0」と、第2の記号列1bの先頭の記号が属するブロック1−2のアドレス「1」との差分(相対ブロック数)である。2つ目の値は、第1の記号列1aの先頭の記号のブロック内での位置と、第2の記号列1bの先頭の記号のブロック内での位置とのずれ量(シフトバイト数)である。3つ目の値は、第2の記号列1bの先頭の記号が属するブロック1−2のアドレス「1」と、第2の記号列1bの最後の記号が属するブロック1−3のアドレス「2」との差分(ストアブロック数)である。4つ目の値は、第2の記号列1bの最後の記号が属するブロック1−3の先頭から、そのブロック1−3内での、第2の記号列1bの最後の記号の位置までの差分(ストアバイト数)である。
また、圧縮対象のデータ1における第3の記号列1cは、例えば4つの値に符号化される。1つ目は、一致する記号列がないことを示す情報である。2つ目は、第3の記号列1cの先頭の記号の、データ1のブロック1−3内での位置と、圧縮データ3aを複数のブロックに分けたときの、第3の記号列1cのコピーの先頭の記号の、圧縮データ3aのブロック内での位置との差分(シフトバイト数)である。3つ目は、第3の記号列1cの先頭の記号が属するブロック1−3のアドレス「2」と、第3の記号列1cの最後の記号が属するブロック1−3のアドレスとの差分(ストアブロック数)である。4つ目は、第3の記号列1cの最後の記号が属するブロック1−3の先頭から、そのブロック1−3内での第3の記号列1cの最後の記号の位置までの差分(ストアバイト数)である。
データを復元する際には、復元手段4bは、例えば、ブロックに満たないバイト列を一時的に保存するレジスタ4baを使用して復元処理を行う。第2の記号列1bの符号を復元する直前では、7バイト「bbbbbbc」がレジスタ4baに格納されている。また符号(1,6,1,4)からは、相対ブロック数「1」、シフトバイト数「6」、ストアブロック数「1」、ストアバイト数「4」が得られる。そして、復元手段4bは、現在位置のブロックの1ブロック前のブロックから1ブロックを取得し、別のレジスタ4bbに格納する。これによりレジスタ4bbには「baaaaabb」の記号列が格納される。復元手段4bは、取得したブロックの記号列を6バイト右にシフトする。すると「baaaaabb」の先頭が6バイト目の位置となる。そして復元手段4bは、シフトした位置と合致するレジスタ4baの位置へ、レジスタ4bbの記号をコピーする。このときレジスタ4ba内の記号がすでに格納されている領域には、コピーされない。すると、レジスタ4bb内の記号列のうち、2つ目の記号からの記号列「aaaaabb」が、レジスタ4ba内の「bbbbbbc」の後に結合される。
次に復元手段4bは、ストアブロック数「1」に基づいて、1ブロック分を記憶手段5内に追加格納する。格納されたブロックは、復元データ5aの後方に追加される。さらに復元手段4bは、ストアバイト数「4」に基づいて、復元した記号列の最後尾を、次の1ブロックの4バイト目と認識する。
このような符号に符号化されることで、復元時には、相対ブロック数とストア数(ストアブロック数)とにより、記憶手段5へのアクセスをブロック単位で行うことができ、復元の高速化が実現される。しかも、コピー元とコピー先のブロック内の繰返し開始位置のずれ量(シフトバイト数)とブロックに満たないバイト数(ストアバイト数)を符号に加えたことで、記号列の一致・不一致をバイト単位で処理することが可能となっている。その結果、データの圧縮率の低下が抑止されている。
なお符号化手段2bは、圧縮データ3aを記録媒体3に格納する際に、圧縮データ3aを複数のブロックに分け、符号と第3の記号列1cのコピーとを、異なるブロックに格納するようにしてもよい。これにより、データ復元装置4が圧縮データ3aを読み込む際に、ブロック単位で行うことが可能となり、データ復元をさらに高速化することができる。
なお、探索手段2a、符号化手段2bは、例えばデータ圧縮装置2が有するプロセッサにより実現することができる。また符号取得手段4a、復元手段4bは、データ復元装置4が有するプロセッサにより実現することができる。
また、図1に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
〔第2の実施の形態〕
次に第2の実施の形態について説明する。第2の実施の形態は、データの復元時にレジスタ内でのデータのシフトによって、符号に対応するデータのコピーを可能とし、処理効率を向上させたものである。
図2は、本実施の形態に用いるコンピュータのハードウェアの一構成例を示す図である。コンピュータ100は、プロセッサ101によって装置全体が制御されている。プロセッサ101には、バス109を介してRAM(Random Access Memory)102と複数の周辺機器が接続されている。プロセッサ101は、マルチプロセッサであってもよい。プロセッサ101は、例えばCPU、MPU(Micro Processing Unit)、またはDSP(Digital Signal Processor)である。プロセッサ101の機能の少なくとも一部を、ASIC(Application Specific Integrated Circuit)、PLD(Programmable Logic Device)などの電子回路で実現してもよい。
RAM102は、コンピュータ100の主記憶装置として使用される。RAM102には、プロセッサ101に実行させるOS(Operating System)のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM102には、プロセッサ101による処理に必要な各種データが格納される。
バス109に接続されている周辺機器としては、HDD103、グラフィック処理装置104、入力インタフェース105、光学ドライブ装置106、機器接続インタフェース107およびネットワークインタフェース108がある。
HDD103は、内蔵したディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。HDD103は、コンピュータ100の補助記憶装置として使用される。HDD103には、OSのプログラム、アプリケーションプログラム、および各種データが格納される。なお、補助記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
グラフィック処理装置104には、モニタ11が接続されている。グラフィック処理装置104は、プロセッサ101からの命令に従って、画像をモニタ11の画面に表示させる。モニタ11としては、CRT(Cathode Ray Tube)を用いた表示装置や液晶表示装置などがある。
入力インタフェース105には、キーボード12とマウス13とが接続されている。入力インタフェース105は、キーボード12やマウス13から送られてくる信号をプロセッサ101に送信する。なお、マウス13は、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
光学ドライブ装置106は、レーザ光などを利用して、光ディスク14に記録されたデータの読み取りを行う。光ディスク14は、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク14には、DVD(Digital Versatile Disc)、DVD−RAM、CD−ROM(Compact Disc Read Only Memory)、CD−R(Recordable)/RW(ReWritable)などがある。
機器接続インタフェース107は、コンピュータ100に周辺機器を接続するための通信インタフェースである。例えば機器接続インタフェース107には、メモリ装置15やメモリリーダライタ16を接続することができる。メモリ装置15は、機器接続インタフェース107との通信機能を搭載した記録媒体である。メモリリーダライタ16は、メモリカード17へのデータの書き込み、またはメモリカード17からのデータの読み出しを行う装置である。メモリカード17は、カード型の記録媒体である。
ネットワークインタフェース108は、ネットワーク10に接続されている。ネットワークインタフェース108は、ネットワーク10を介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
以上のようなハードウェア構成によって、第2の実施の形態の処理機能を実現することができる。なお、第1の実施の形態に示した装置も、図2に示したコンピュータ100と同様のハードウェアにより実現することができる。
コンピュータ100は、例えばコンピュータ読み取り可能な記録媒体に記録されたプログラムを実行することにより、第2の実施の形態の処理機能を実現する。コンピュータ100に実行させる処理内容を記述したプログラムは、様々な記録媒体に記録しておくことができる。例えば、コンピュータ100に実行させるプログラムをHDD103に格納しておくことができる。プロセッサ101は、HDD103内のプログラムの少なくとも一部をRAM102にロードし、プログラムを実行する。またコンピュータ100に実行させるプログラムを、光ディスク14、メモリ装置15、メモリカード17などの可搬型記録媒体に記録しておくこともできる。可搬型記録媒体に格納されたプログラムは、例えばプロセッサ101からの制御により、HDD103にインストールされた後、実行可能となる。またプロセッサ101が、可搬型記録媒体から直接プログラムを読み出して実行することもできる。
このようなコンピュータ100により、データの圧縮と復元が行われる。ここで、第2の実施の形態における符号化方式について説明する。第2の実施の形態では、既に符号化された記号列を辞書として用いた符号化が行われる。
図3は、辞書と記号との対応付けを示す図である。第2の実施の形態では、スライド窓と呼ばれるバッファ112が用意される。バッファ112には、符号化対象の記号列が、先頭から順にFIFO(先入れ−先出し)方式で格納される。バッファ112の前半は参照部112aであり、後半は符号化部112bである。参照部112aは、符号化済みの記号列が格納される。符号化部112bには、符号化されていない記号列が格納される。
第2の実施の形態では、符号化対象のデータは、複数のブロック21〜24に分割されている。各ブロック21〜24には、所定数の記号列が含まれる。図3の例では、1つの記号のデータ長を1バイトとし、1ブロックに8つの記号が含まれるものとしている。すなわち、8バイトで1ブロックとなる。
未圧縮の記号を符号化する場合、符号化部112bの先頭からの記号列から、最も長く一致する記号列が参照部112aから検索される。図3の例では、符号化部112bに「compress pression.」という記号列が格納されている。このうち「compress」という記号列が、参照部112aから検出できる。すると、「compress」という記号列が、参照部112a内での一致した記号列の位置や、一致した記号列の一致終了位置を表す符号に、符号化される。
「compress」に続く記号列は、先頭のスペースの記号だけが、参照部112aから検出できる。このように、一致する記号列が1つの記号だけの場合、符号化してもデータ量の削減効果があまり期待できない。そこで第2の実施の形態では、一致する記号列が1つの記号だけの場合には、一致する記号列はないと判定するものとする。なお、一致する記号列の長さがどの程度以上であれば、一致すると判定するのかは、任意に設定可能である。例えば1つの記号(1バイト)でも一致すれば、記号列が一致すると判定してもよい。また、例えば3つの記号(3バイト)以上一致した場合に、記号列が一致すると判定することもできる。一致する記号列がない場合は、参照部112a内に一致する記号列がないことを示す符号(不一致符号)と、圧縮データ内での該当記号列の位置や、一致した記号列の一致終了位置を表す符号に、符号化される。
スペースに続く「pression」という記号列は、参照部112aから検出できる。すると、「pression」という記号列が、参照部112a内の一致した記号列の位置や、一致した記号列の一致終了位置を表す符号に、符号化される。
第2の実施の形態では、データを圧縮する際には、データの復元時にブロック単位でのメモリアクセスが容易となるような形式の符号に、符号化される。
図4は、符号のデータ構造の一例を示す図である。第2の実施の形態では、2バイト(16ビット)の符号に符号化される。一致記号列がある場合は、相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を示す値に符号化される。また一致記号列がない場合は、不一致符号、シフトバイト数、ストアブロック数、ストアバイト数を示す値に符号化される。相対ブロック数は、5ビットのデータであり、「1−31」の数値である。シフトバイト数は3ビットのデータであり、「0−7」の数値である。ストアブロック数は5ビットのデータであり、「1−31」の数値を示す。ストアバイト数は3ビットのデータであり、「0−7」の数値を示す。ここで一致記号列がない場合、相対ブロック数の領域に「0」が設定される。この「0」値が、不一致符号である。
次に、符号内の各値の意味について説明する。
図5は、一致記号列がある場合の符号の一例を示す図である。圧縮対象データ31は、8バイトのブロック単位に分けられている。各ブロックには「0」から昇順のアドレスが付与されている。ブロック内の各記号(1バイト)には、左から順に、「0」から昇順のバイト番号が付与されている。
「pression」という記号列を符号化する場合について説明する。符号化対象の「pression」という記号列は、ブロックアドレス「2」のブロックの8番目記号(ブロック内のバイト番号「7」)から、ブロックアドレス「3」のブロックの7番目記号(ブロック内のバイト番号「6」)までの8バイトである。符号化対象の記号列に一致する記号列は、ブロックアドレス「0」のブロックの4番目記号(ブロック内のバイト番号「3」)から、ブロックアドレス「1」のブロックの3番目記号(ブロック内のバイト番号「2」)までの8バイトである。
相対ブロック数は、符号化対象の記号列の先頭の記号を含むブロックのアドレスと、符号化対象の記号列に一致する記号列の先頭の記号を含むブロックのアドレスとの差分である。図5の例では、相対ブロック数は「2」である。
シフトバイト数は、符号化対象の記号列の先頭の記号のブロック内での位置と、符号化対象の記号列に一致する記号列の先頭の記号のブロック内での位置との差分である。例えば、符号化対象の記号列の先頭の記号のブロック内での位置を示すバイト番号から、符号化対象の記号列に一致する記号列の先頭の記号のブロック内での位置を示すバイト番号を減算した値が、シフトバイト数となる。ただし、減算した値が負になるときは、減算結果に「8」(1ブロック分のバイト数)が加算される。図5の例では、シフトバイト数は「4」である。
ストアブロック数は、符号化対象の記号列の先頭の記号を含むブロックのアドレスと、その記号列の最後の記号(一致終了位置)を含むブロックのアドレスとの差分である。図5の例では、ストアブロック数は「1」である。
ストアバイト数は、符号化対象の記号列の最後の記号を含むブロックの先頭の記号から、その記号列の最後の記号までの記号数である。図5の例では、ストアバイト数は「7」である。
このようにして、一致記号列がある場合の符号C4が生成される。次に、一致記号列がない場合の符号について説明する。なお、一致記号列が見つからない記号が連続していれば、その記号列がまとめて符号化される。
図6は、一致記号列がない場合の符号の一例を示す図である。一致記号列がない場合には、圧縮データ32における記号の位置に関する情報を使用して符号が生成される。圧縮データ32は、8バイトのブロック単位に分けられている。各ブロックには「0」から昇順のアドレスが付与されている。ブロック内の各記号(1バイト)には、左から順に、「0」から昇順のバイト番号が付与されている。
「compression de」の記号列を符号化する場合について説明する。この記号列は、ブロックアドレス「0」のブロックの1番目記号(ブロック内のバイト番号「0」)から、ブロックアドレス「1」のブロックの6番目記号(ブロック内のバイト番号「5」)までの14バイトである。この記号列は、一致する記号列が見つからない。そこで、符号の最初の7ビットの値には、不一致符号「0」が設定される。
シフトバイト数は、符号化対象の記号列の先頭の記号のブロック内での位置と、圧縮データ32に該当する記号列を格納した場合における、その記号列の先頭の記号のブロック内での位置との差分である。例えば、符号化対象の記号列の先頭の記号のブロック内での位置を示すバイト番号から、圧縮データ32内での該当記号列の先頭の記号のブロック内での位置を示すバイト番号を減算した値が、シフトバイト数となる。ただし、減算した値が負になるときは、減算結果に「8」(1ブロック分のバイト数)が加算される。なお一致記号列がない場合、生成された符号(2バイト)の後に続けて、圧縮対象の記号列が格納される。そのため、符号の分を考慮して、圧縮データ32内での記号列の先頭の記号の位置が判断される。図6の例では、符号化対象の記号列の先頭の記号のブロック内での位置を示すバイト番号が「0」、圧縮データ32内での該当記号列の先頭の記号のブロック内での位置を示すバイト番号が「2」である。すると「0」から「2」を減算すると「−2」となる。減算結果が負であるため8が加算され、シフトバイト数は「6」となる。
ストアブロック数は、符号化対象の記号列の先頭の記号を含むブロックのアドレスと、その記号列の最後の記号(不一致終了位置)を含むブロックのアドレスとの差分である。図6の例では、ストアブロック数は「1」である。
ストアバイト数は、符号化対象の記号列の最後の記号を含むブロックの先頭の記号から、その記号列の最後の記号までの記号数である。図6の例では、ストアバイト数は「6」である。
生成された符号C1は、圧縮データ32の記憶領域に格納される。そして、一致する記号列が見つからなかった符号化前の記号列が、符号C1に続けて格納される。図6の例では、符号C1に続けて、「compression de」の記号列が格納されている。
図7は、圧縮データの一例を示す図である。図7の例では、「compression de」の記号列は、圧縮されずに、符号C1に続けて圧縮データ32に設定されている。「compress」の記号列は、符号C2に圧縮され、圧縮データ32に設定されている。スペースの記号は、符号C3に続けて、圧縮データ32に設定されている。「pression」の記号列は、符号C4に圧縮され、圧縮データ32に設定されている。
図3〜図7に示したように符号化することで、元のデータよりも圧縮データのデータ量は削減される。すなわち、データが圧縮される。この圧縮方式は可逆圧縮である。従って、圧縮データに基づいて、データを欠損させずに復元することができる。
次に、図3〜図7に示した符号化によるデータの圧縮と、圧縮されたデータの復元とを行うための、コンピュータ100の機能について説明する。
図8は、データの圧縮・復元の機能を示すブロック図である。コンピュータ100は、圧縮部110、圧縮データ記憶部120、復元部130、および復元データ記憶部140を有している。
圧縮部110は、圧縮対象のデータを圧縮する。例えばRAM102、HDD103、光ディスク14、メモリカード17のいずれかに格納されたデータを圧縮する。また圧縮部110は、ネットワーク10を介して受信したデータを圧縮することもできる。圧縮部110は、圧縮したデータ(圧縮データ)を、圧縮データ記憶部120に格納する。
圧縮データ記憶部120は、圧縮部110で圧縮された圧縮データを記憶する。例えばRAM102、HDD103、光ディスク14、メモリカード17のいずれかの記憶領域の一部を、圧縮データ記憶部120として使用することができる。
復元部130は、圧縮データ記憶部120に格納された圧縮データを、元のデータに復元する。復元部130は、復元したデータをブロック単位で復元データ記憶部140に書き込む。また復元部130は、復元時には、既に復元した記号が格納されたブロックを復元データ記憶部140からブロック単位で読み出すか、圧縮データ内の記号を圧縮データ記憶部120からブロック単位で読み出す。そして復元部130は、圧縮データ内の符号を、読み出したブロック内の記号に置き換えることで、符号を元の記号に復元する。
復元データ記憶部140は、復元されたデータを記憶する。例えばRAM102、HDD103、光ディスク14、メモリカード17のいずれかの記憶領域の一部を、復元データ記憶部140として使用することができる。なお復元を高速に行うには、高速にアクセス可能な装置を、復元データ記憶部140と使用することが望ましい。そこで、第2の実施の形態では、復元データ記憶部140は、RAM102の記憶領域の一部であるものとする。
次に、圧縮部110と復元部130との機能の詳細について説明する。
圧縮部110は、データ取得部111、バッファ112、一致検出部113、相対ブロック数算出部114、シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117、および符号生成部118を有する。
データ取得部111は、圧縮対象のデータを取得する。例えばデータ取得部111は、ユーザからの入力に基づいて、圧縮対象のデータを把握する。圧縮対象のデータは、例えば、HDD103、光ディスク14、またはメモリカード17に格納されたデータである。またネットワークインタフェース108がネットワーク10を介して受信したデータを圧縮対象とすることもできる。データ取得部111は、圧縮対象のデータ(記号列)を、順次バッファ112に格納する。
バッファ112は、符号化済みの所定量の記号列と、符号化対象の所定量の記号列とを記憶する。バッファ112の構造は、図3に示した通りである。
一致検出部113は、符号化部112bの先頭から始まるできるだけ長い記号列に一致する記号列を、バッファ112の参照部112a内の記号列から検出する。一致検出部113は、一致する記号列が見つかった場合、参照部112a内の該当する記号列の位置と、記号列の長さとを特定する。また一致検出部113は、一致する記号列が見つからなかった場合、一致する記号列が見つからなかった記号列の長さを特定する。一致検出部113は、一致する記号列が見つからなかった場合、不一致符号を示す値「0」を5ビットで表し、その値を符号生成部118に出力する。また一致検出部113は、一致する記号列が見つからなかった場合、不一致であることを示す情報を符号生成部118に出力してもよい。その場合、不一致であることを示す情報を受け取った符号生成部118が符号を生成する際に、その符号の先頭の5ビットに「0」を設定する。
相対ブロック数算出部114は、一致検出部113により、一致する記号列が見つかった場合、相対ブロック数を算出する。例えば相対ブロック数算出部114は、符号化部112bの先頭の記号が含まれるブロックのアドレスから、参照部112a内の一致した記号列が含まれるブロックのアドレスを減算する。そして相対ブロック数算出部114は、減算した結果を相対ブロック数とする。そして、相対ブロック数算出部114は、5ビットで表した相対ブロック数を、符号生成部118に出力する。
シフトバイト数算出部115は、一致検出部113の検出結果に応じて、シフトバイト数を算出する。例えばシフトバイト数算出部115は、一致する記号列が見つかった場合、符号化部112bの先頭の記号のバイト番号に8を加算する。8を加算するのは、次の減算による結果が、常に正の値になるようにするためである。シフトバイト数算出部115は、加算結果から、参照部112a内における一致する記号列の先頭の記号のバイト番号を減算する。そしてシフトバイト数算出部115は、減算結果を8で除算したときの剰余を、シフトバイト数とする。またシフトバイト数算出部115は、一致する記号列が見つからなかった場合、符号化部112bの先頭の記号のバイト番号に8を加算し、さらに圧縮データ内での該当記号列の先頭の記号のバイト番号を減算する。そしてシフトバイト数算出部115は、減算結果を8で除算したときの剰余を、シフトバイト数とする。シフトバイト数算出部115は、算出したシフトバイト数を3ビットで表し、その値を符号生成部118に出力する。
ストアブロック数算出部116は、一致検出部113の検出結果に応じて、ストアブロック数を算出する。例えばストアブロック数算出部116は、一致する記号列が見つかった場合、符号化部112b内の一致した記号列の最後の記号(一致終了位置)を含むブロックのアドレスから、符号化部112bの先頭の記号を含むブロックのアドレスを減算する。そしてストアブロック数算出部116は、減算した結果を、ストアブロック数とする。またストアブロック数算出部116は、一致する記号列が見つからなかった場合、一致する記号列が見つからないと判定された最後の記号を含むブロックのアドレスから、その符号化部112bの先頭の記号を含むブロックのアドレスを減算する。ストアブロック数算出部116は、減算した結果を、ストアブロック数とする。そして、ストアブロック数算出部116は、算出したストアブロック数を5ビットで表し、その値を符号生成部118に出力する。
ストアバイト数算出部117は、一致検出部113の検出結果に応じて、ストアバイト数を算出する。例えばストアバイト数算出部117は、一致する記号列が見つかった場合、一致する記号列が見つかった符号化部112b内の記号列の最後の記号を含むブロックの先頭から、その記号列の最後の記号までの記号数をストアバイト数とする。なお、この記号数は、符号化対象の記号列の最後の記号のバイト番号に1を加算した値となる。またストアバイト数算出部117は、一致する記号列が見つらなかった場合、一致する記号列が見つからないと最後に判定された記号を含むブロックの先頭の記号から、最後に判定された記号までの記号数をストアバイト数とする。そしてストアバイト数算出部117は、算出したストアバイト数を3ビットで表し、その値を符号生成部118に出力する。
符号生成部118は、2バイトの領域に、相対ブロック数算出部114の出力値、シフトバイト数算出部115の出力値、ストアブロック数算出部116の出力値、ストアバイト数算出部117の出力値の順で設定する。符号生成部118は、得られた2バイトの値を、符号として、圧縮データ記憶部120に格納する。なお符号生成部118は、相対ブロック数算出部114から不一致符号が出力された場合、バッファ112の符号化部112bから、一致する記号列が見つからなかった記号列を取得する。そして符号生成部118は、一致する記号列が見つからなかった場合の符号に続けて、取得した記号列を圧縮データ記憶部120に格納する。
なお、図1の探索手段2aは、圧縮部110内のデータ取得部111、バッファ112、および一致検出部113によって実現される。また図1の符号化手段2bは、相対ブロック数算出部114、シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117、および符号生成部118によって実現される。
次に、復元部130の機能の詳細について説明する。
復元部130は、符号解析部131、ブロック取得部132、レジスタ群133、記号列生成部134、およびブロック出力部135を有する。
符号解析部131は、復元する圧縮データを圧縮データ記憶部120から取得する。そして符号解析部131は、取得した圧縮データの符号を先頭から順に解析する。例えば符号解析部131は、圧縮データの先頭から2バイトずつ符号を取得する。符号解析部131は、取得した符号の先頭の5ビットを相対ブロック数、次の3ビットをシフトバイト数、次の5ビットをストアブロック数、最後の3ビットをストアバイト数と認識する。ただし、先頭の5ビットの値が0の場合、符号解析部131は、その5ビットは相対ブロック数ではなく、不一致符号であると認識する。
ブロック取得部132は、符号解析部131による解析結果に基づいて、データの復元に用いるブロックを、圧縮データ記憶部120または復元データ記憶部140から取得する。例えばブロック取得部132は、復元対象の符号に相対ブロック数が含まれている場合、復元中のブロック(現在のブロック)のアドレスよりも相対ブロック数分だけ前のアドレスのブロックから順に、復元データ記憶部140からブロックを取得する。またブロック取得部132は、復元対象の符号に不一致符号が含まれている場合、復元対象の符号に続けて格納されている記号列を、ブロック単位で圧縮データ記憶部120から取得する。ブロック取得部132は、1つの復元対象の符号に応じたブロックの取得を、その符号に示されるストアブロック数分のブロックのストアが完了するまで続ける。
レジスタ群133は、ブロック取得部132が取得したブロックの値(記号列)を格納する、複数のレジスタである。このレジスタ群133内で記号列のシフトや結合(マージ)などの操作を行うことで、圧縮前の記号列を復元することができる。
記号列生成部134は、符号解析部131による解析結果に基づいて、レジスタ群133内の記号列を操作し、圧縮前の記号列をブロック単位で復元する。
ブロック出力部135は、レジスタ群133内に復元された記号列を、ブロック単位で復元データ記憶部140に格納する。
なお、図1の符号取得手段4aは、符号解析部131によって実現される。また図1の復元手段4bは、ブロック取得部132、レジスタ群133、記号列生成部134、およびブロック出力部135によって実現される。
また、図8に示した各要素間を接続する線は通信経路の一部を示すものであり、図示した通信経路以外の通信経路も設定可能である。
次に、圧縮処理の手順について説明する。
図9は、圧縮処理の手順の一例を示すフローチャートである。この処理は、例えば圧縮対象データを指定した圧縮指示が入力されたときに実行される。
[ステップS101]データ取得部111は、バッファ112の符号化部112bの容量分の記号列を、圧縮対象データの先頭から順に符号化部112bに格納する。なお符号化部112b内の符号化された記号は参照部112aにシフトされる。そのため、データ取得部111は、記号列が符号化されるごとに、符号化されたデータ量分の未圧縮の記号列を符号化部112bに格納する。
そして、一致検出部113は、バッファ112内の符号化部112bの先頭の記号から順に選択し、選択した記号列に一致する記号列を、参照部112aから探索する。
[ステップS102]一致検出部113は、一致する記号列があるか否かを判断する。一致する記号列がある場合、処理がステップS104に進められる。一致する記号列がない場合、処理がステップS103に進められる。
[ステップS103]一致する記号列が見つからなかった場合、一致検出部113は、一致記号が見つからなかった記号の長さ(バイト数)をカウントする。例えば、新たに探索して一致記号が見つからなかった記号列のバイト数を、一致記号が見つからなかった記号の長さに加算する。そして一致検出部113は、処理をステップS101に進め、次の記号を選択して、一致する記号列の探索を行う。
[ステップS104]一致する記号列が見つかった場合、一致検出部113は、一致する記号列が検出できた記号列の直前に、「一致記号列なし」と判定された記号列(不一致記号列)があるか否かを判断する。不一致記号列がある場合、処理がステップS105に進められる。不一致記号列がない場合、処理がステップS108に進められる。
[ステップS105]一致記号列なしと判定された記号列がある場合、一致検出部113は、不一致符号を生成する。一致検出部113は、不一致符号を、符号生成部118に出力する。
[ステップS106]シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117が、それぞれシフトバイト数、ストアブロック数、およびストアバイト数を算出する。なお、ストアブロック数とストアバイト数との算出には、一致記号が見つからなかった長さが利用される。すなわち、符号化部112bの先頭の記号から、一致記号が見つからなかった長さが、不一致記号列の長さとなる。そして不一致記号列の最後の記号の位置が不一致終了位置となる。その不一致終了位置に基づいて、ストアブロック数とストアバイト数とが算出される。シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117それぞれは、算出した値を符号生成部118に出力する。
[ステップS107]符号生成部118は、出力された値を繋げて、一致する記号列がない場合の符号を生成する。そして符号生成部118は、生成した符号を、圧縮データ記憶部120に格納する。次に符号生成部118は、一致記号列なしと判断された記号列をバッファ112の符号化部112bから取得し、圧縮データ記憶部120に格納する。
[ステップS108]相対ブロック数算出部114、シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117が、それぞれ相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を算出する。相対ブロック数算出部114、シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117それぞれは、算出した値を符号生成部118に出力する。
[ステップS109]符号生成部118は、他の要素から出力された値を繋げて、一致する記号列がある場合の符号を生成する。そして符号生成部118は、生成した符号を、圧縮データ記憶部120に格納する。
[ステップS110]一致検出部113は、すべてのデータの符号化が終了したか否かを判断する。例えば一致検出部113は、バッファ112の符号化部112bが空になった場合、符号化が終了したと判断する。符号化が終了した場合、データの圧縮処理を終了する。符号化が終了していなければ、処理がステップS101に進められる。
このようにして、データが圧縮され、圧縮データ32が圧縮データ記憶部120に格納される。圧縮データ記憶部120に格納された圧縮データ32は、復元部130によって元のデータに復元される。
図10は、データ復元処理の手順の一例を示す図である。この処理は、例えば圧縮データを指定した復元指示が入力されたときに実行される。
[ステップS121]符号解析部131は、圧縮データの先頭から順に符号を読み出す。そして符号解析部131は、読み出した符号が、一致記号列がある場合の符号か否かを判断する。例えば符号の最初の5ビットの値が「0」でなければ、一致記号列がある場合の符号である。一致記号列がある場合の符号であれば、処理がステップS122に進められる。また一致記号列がない場合の符号であれば、処理がステップS124に進められる。
[ステップS122]一致記号列がある場合の符号であれば、符号解析部131は、取得した符号から、相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。
[ステップS123]ブロック取得部132は、次に復元した記号の格納位置(現在位置)を含むブロックから相対ブロック数前の復元されたブロックを、復元データ記憶部140から取得する。ブロック取得部132は、取得したブロックをレジスタ群133に格納する。その後、処理がステップS126に進められる。
[ステップS124]一致記号列がない場合の符号であれば、符号解析部131は、取得した符号から、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。
[ステップS125]ブロック取得部132は、取得した符号に続けて圧縮データ記憶部120に格納されている記号列を、ブロック単位で取得する。ブロック取得部132は、取得したブロックをレジスタ群133に格納する。
[ステップS126]記号列生成部134は、レジスタ群133内で、記号列のシフトやマージ処理を行い、符号に対応する記号列を復元する。そしてブロック出力部135は、復元された記号列を、ブロック単位で復元データ記憶部140に格納する。
[ステップS127]符号解析部131は、圧縮データの復元が終了したか否かを判断する。復元が終了した場合、処理が終了する。復元が終了していなければ、処理がステップS121に進められる。
このようにして、圧縮データから元のデータを復元することができる。なお、第2の実施の形態では、レジスタ群133内での記号列のシフトやマージ処理によって、記号列を復元することができる。
図11は、レジスタ群を用いた復元手順の一例を示す図である。図11の例では、レジスタ群133内のレジスタを3つの用途で用いている。
ロード用レジスタ41,42は、ブロック取得部132が取得したブロック単位の記号列を格納するレジスタである。例えば8バイトの2つのレジスタが、ロード用レジスタ41,42として使用される。
マージ用レジスタ43は、記号列の結合に使用するレジスタである。例えば、16バイトの1つのレジスタが、マージ用レジスタ43として使用される。
未ストアバッファ44は、復元された記号列のうち、復元データ記憶部140に格納されていない記号列を格納しておくバッファである。例えば8バイトの1つのレジスタが、未ストアバッファ44として使用される。
ここで、符号C4を復元に基づいて記号列を復元する場合を想定して、復元手順を説明する。なお、符号C4を復元するときには、圧縮データ32における符号C4より前の符号はすでに復元され、ブロック単位で復元データ33の記憶領域に格納されている。また、未ストアバッファ44には、それまでの復元処理によって記号列が格納されている。未ストアバッファ44内の記号列のうち、直前の符号C3のストアバイト数「7」で示されるバイト数分の記号列が、復元された記号列である。図11の例では、「mpress 」の記号列が、復元された記号列である。
符号C4に基づいてデータを復元する場合、まず、符号C4の相対ブロック数に基づいて、ブロック単位で記号列が取得される。例えば符号C4の相対ブロック数は「2」であるため、復元データ33から、次にブロックを格納するアドレス「2」よりも、2つ前のアドレス「0」のブロックが取得される。図11の例では、符号C4の復元のために、2つのブロックが取得されている。取得されたブロックは、ロード用レジスタ41,42に格納される。なおロード用レジスタ41,42への複数のブロックの格納は、同時でなくてもよい。例えば、図11におけるアドレス「0」のブロックをロード用レジスタ41に格納し、その後のシフト・マージ処理、復元されたブロックの格納処理を行うこともできる。このとき、復元されたブロック数がストアブロック数に満たない場合に、次のブロックがロード用レジスタ41に書き込まれる。
そしてロード用レジスタ41,42内の記号列と、未ストアバッファ44内の記号列とが、マージ用レジスタ43内でマージされる。このとき、未ストアバッファ44内の先頭から、直前の符号C3に示されるストアバイト数(7バイト)分の記号列が、マージ用レジスタ43の先頭にコピーされる。そしてロード用レジスタ41,42内の記号列が、符号C4のシフトバイト数「4」分右にシフトされ、未ストアバッファ44の記号列が格納されていない領域にコピーされる。例えば、ロード用レジスタ41の4バイト目の記号「p」は、4バイトシフトされることで、マージ用レジスタ43内の8バイト目に格納される。ロード用レジスタ41の最初の3バイト分の記号列「com」は、4バイトシフトした位置が、未ストアバッファ44内のコピー対象の記号列の格納領域と重なるためコピーされない。
記号列のマージ処理が終了すると、復元が完了したブロックが、復元データ33に追加される。図11の例では、符号C4のストアブロック数は「1」である。そこでマージ処理が完了すると、マージ用レジスタ43の先頭から1ブロックが、復元データ33に追加される。またマージ用レジスタ43内に復元された記号列のうち、1ブロック分に満たない記号列は、未ストアバッファ44に格納される。符号C4のストアバイト数は「7」であることから、未ストアバッファ44に格納された記号列のうち、先頭から7バイト分の記号列のみが、復元された記号列であることがわかる。
このようにして、ブロック単位で記号列を取得し、レジスタ群133内の簡単な操作によってブロック単位でデータを復元し、復元したデータを格納することができる。
次に、レジスタ内での記号列の操作を含めた、圧縮・復元の詳細な処理手順について説明する。
図12は、レジスタを効率的に利用した圧縮処理の手順の一例を示すフローチャートである。
[ステップS201]データ取得部111が圧縮対象のデータをバッファ112に格納すると共に、一致検出部113がパラメータを初期化する。初期化されるパラメータは、以下の通りである。
current_p=0
code_p=0
literal_num=0
pre_storeB=0
「current_p」は、現在、一致・不一致の探索対象となっている記号の位置が、圧縮対象データ31の何バイト目かを示している。「code_p」は、生成した符号の圧縮データ32内での格納位置が、圧縮データ32の何バイト目かを示している。「literal_num」は、一致する記号列なしと判定された記号列の長さを示している。「pre_storeB」は、直前の符号の復元により未ストアバッファ44に格納された、記号列のバイト数(現在のストアバイト数)を示している。
[ステップS202]一致検出部113は、「current_p」で示される記号を先頭とする記号列に一致する記号列を、参照部112aから探索する。該当する記号列が見つかった場合、一致検出部113は、一致する記号列の長さを「match_len」に設定すると共に、参照部112a内で一致する記号列の先頭の位置を「match_p」に設定する。
[ステップS203]一致検出部113は、ステップS202の探索で、一致する記号列が見つかったか否かを判断する。一致する記号列が見つかった場合、処理がステップS205に進められる。一致する記号列が見つからなかった場合、処理がステップS204に進められる。
[ステップS204]一致検出部113は、「literal_num」の値をインクリメント(1加算)する。また一致検出部113は、「current_p」の値をインクリメントする。その後、処理がステップS202に進められる。
[ステップS205]一致検出部113は、「literal_num」の値が0か否かを判断する。「literal_num」の値が0でない場合、不一致の記号列が存在する。この場合、処理がステップS206に進められ得。「literal_num」の値が0の場合、不一致の記号列が存在しない。この場合、処理がステップS210に進められる。
[ステップS206]シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117が、それぞれシフトバイト数、ストアブロック数、およびストアバイト数を算出する。
シフトバイト数「shiftB」は、例えば以下の式で計算される。
shiftB=[8+{(current_p - literal_num) % 8} - (code_p + 2) % 8] % 8; ・・・(1)
「=」は代入演算子である。「%」は剰余を示す演算子である。「current_p - literal_num」は、不一致記号列の先頭の記号の位置を示している。「current_p - literal_num」を8で除算したときの剰余は、圧縮対象データ31内での不一致記号列の先頭の記号のブロック内での位置を表している。「(code_p + 2)」は、圧縮データ32における不一致の場合の符号(2バイト)の次の位置を示しており、この位置が、不一致記号列の圧縮データ32内での位置となる。「(code_p + 2)」を8で除算した剰余は、圧縮データ32内での不一致記号列の先頭の記号のブロック内での位置を表している。この式(1)により、圧縮対象データ31内での不一致記号列の先頭の記号のブロック内での位置と、圧縮データ32内での不一致記号列の先頭の記号のブロック内での位置との差分が、シフトバイト数「shiftB」に設定される。
ストアブロック数「storeBL」は、例えば以下の式で計算される。
storeBL = (pre_storeB + literal_num) / 8; ・・・(2)
「/」は、除算の商を計算する演算子である。
ストアバイト数は「storeB」は、例えば以下の式で計算される。
storeB = (pre_storeB + literal_num) % 8; ・・・(3)
[ステップS207]符号生成部118は、ステップS206で算出された値に基づいて、符号を生成する。例えば、符号生成部118は、以下の処理を行う。
CodeBuff[code_p] = 0 | shiftB; ・・・(4)
CodeBuff[code_p+1] = storeBL<<3 | storeB; ・・・(5)
「|」は、論理和を示している。「<<」は、右側の数値分(バイト)の左シフトを示している。「CodeBuff[]」は、圧縮データ32を格納するバッファ(圧縮データ記憶部120)を示している。例えば「CodeBuff[code_p]」は、圧縮データ32内の「code_p」で示される記憶領域を示している。式(4)により、圧縮データ32に、不一致符号とシフトバイト数とを示す1バイトの値(符号の前半)が設定される。式(4)で設定された値に続けて、式(5)により、ストアブロック数とストアバイト数とを示す1バイトの値(符号の後半)が設定される。その後、圧縮データ32内での次の格納位置が、2バイト先に更新される。すなわち、「code_p +=2」が実行される。「+=」は、左のパラメータへの右側の数値の加算を示している。
[ステップS208]符号生成部118は、不一致記号列のうちの1つの記号を、圧縮データ32にコピーする。例えば、以下の命令でコピーが行われる。
CodeBuff[code_p] = OriBuff[current_p - literal_num]; ・・・(6)
「OriBuff[]」は、圧縮対象データ31が格納されたバッファを示している。[]内の値により、バッファ内の記憶領域が特定される。式(6)により、不一致記号列のうちのコピーが未了の記号が、圧縮データ32にコピーされる。その後、「literal_num」がデクリメント(literal_num --)される。また「code_p」がインクリメントされ、圧縮データ32内での次の格納位置が1バイト先に更新される(code_p ++)。
[ステップS209]符号生成部118は、不一致記号列のすべてのコピーが完了したか否かを判断する。例えば符号生成部118は、「literal_num」が「0」になったか否かにより、不一致記号列のコピーの完了の有無を判断する。不一致記号列のコピーが完了していれば、処理がステップS210に進められる。不一致記号列のコピーが完了していなければ、処理がステップS208に進められる。
[ステップS210]相対ブロック数算出部114、シフトバイト数算出部115、ストアブロック数算出部116、ストアバイト数算出部117が、それぞれ相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を算出する。
相対ブロック数「relativeBL」は、例えば以下の式で計算される。
relativeBL = (current_p % 8) - (match_p % 8); ・・・(7)
「(current_p % 8)」により、符号化部112b内の一致した記号列の先頭の記号を含むブロックのアドレスが得られる。「(match_p % 8)」により、参照部112a内の一致した記号列の先頭の記号を含むブロックのアドレスが得られる。式(7)により、それらのアドレスの差分が得られる。
シフトバイト数「shiftB」は、例えば以下の式で計算される。
shiftB = {8+(current_p % 8) - (match_p % 8)} % 8; ・・・(8)
ストアブロック数「storeBL」は、例えば以下の式で計算される。
storeBL = (pre_storeB + match_len) / 8; ・・・(9)
ストアバイト数「storeB」は、例えば以下の式で計算される。
storeB = (pre_storeB + match_len) % 8; ・・・(10)
[ステップS211]符号生成部118は、ステップS210で算出された値に基づいて、符号を生成する。例えば、符号生成部118は、以下の処理を行う。
CodeBuff[code_p] = (relativeBL<<3) | shiftB; ・・・(11)
CodeBuff[code_p+1] = (storeBL<<3) | storeB; ・・・(12)
式(11)により、圧縮データ32に、相対ブロック数とシフトバイト数とを示す1バイトの値(符号の前半)が設定される。式(11)で設定された値に続けて、式(12)により、ストアブロック数とストアバイト数とを示す1バイトの値(符号の後半)が設定される。さらに、現在のストアバイト数「pre_storeB」に、ストアバイト数「storeB」が設定される(pre_storeB = storeB)。その後、圧縮データ32内での次の格納位置が、2バイト先に更新される(code_p +=2)。また「current_p」に、一致する記号列の長さ「match_len」が加算される(current_p += match_len)。
[ステップS212]一致検出部113は、すべての圧縮データの圧縮が終了したか否かを判断する。圧縮が終了した場合、圧縮処理が終了する。圧縮が終了していなければ、処理がステップS202に進められる。
このように、レジスタを効率的に利用して、データを圧縮することができる。次に、データのレジスタを効率的に利用した復元処理について詳細に説明する。
図13は、レジスタを効率的に利用した復元処理の手順の一例を示すフローチャートである。
[ステップS221]符号解析部131は、パラメータを初期化する。初期化されるパラメータは、以下の通りである。
ori_p8 = 0
code_p = 0
pre_storeB = 0
「ori_p8」は、復元データ33における、次に復元するブロックのアドレスを示す。「code_p」は、次に復元する符号の位置を示す。
[ステップS222]符号解析部131は、復元する符号に不一致符号が設定されているか否かを判断する。例えば符号解析部131は、「code_p」で示される圧縮データ32内の値(符号の前半1バイト)を右に3ビットシフトした値が「0」か否かによって、不一致符号の有無を判定する((CodeBuff[code_p] >> 3) != 0)。不一致符号が設定されていれば、処理がステップS225に進められる。不一致符号が設定されていなければ、処理がステップS223に進められる。
[ステップS223]不一致符号が設定されていない場合、符号解析部131は、復元する符号から、相対ブロック数、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。例えば、符号解析部131は、以下の命令を実行する。
relativeBL = CodeBuff[code_p] >> 3; ・・・(13)
shiftB = CodeBuff[code_p] & 0x07; ・・・(14)
storeBL = CodeBuff[code_p+1] >> 3; ・・・(15)
storeB = CodeBuff[code_p+1] & 0x07; ・・・(16)
「>>」は、右側の数値分(バイト)の右シフトを示している。「&」は、論理積の演算子である。式(13)では、「CodeBuff[code_p] >> 3」により、符号の前半の1バイトが右に3ビットシフトされ、上位5ビットの値のみが残される。残された5ビットで示される値が、相対ブロック数(relativeBL)に設定される。式(14)では、「CodeBuff[code_p] & 0x07」により、符号の前半1バイトの値と、上位5ビットが「0」であり下位3ビットが「1」のビット列との、ビットごとの論理和演算が行われる。これにより、符号の前半1バイトの下位3ビットの値みが残される。残された3ビットで示される値が、シフトバイト数(shiftB)に設定される。式(15)では、「CodeBuff[code_p+1] >> 3」により、符号の後半の1バイトが右に3ビットシフトされ、上位5ビットの値のみが残される。残された5ビットで示される値が、ストアブロック数(storeBL)に設定される。式(16)では、「CodeBuff[code_p+1] & 0x07」により、符号の後半の1バイトの値と、上位5ビットが「0」であり下位3ビットが「1」のビット列との、ビットごとの論理和演算が行われる。これにより、符号の後半1バイトの下位3ビットの値のみが残される。残された3ビットで示される値が、ストアバイト数(storeB)に設定される。その後、「code_p」で示す位置が、2バイト分先に進められる(code_p += 2)。
[ステップS224]ブロック取得部132は、復元データ33内のコピー元のブロックのアドレスを、コピー元アドレス(copy_p8)に設定する。例えばブロック取得部132は、以下の計算により、コピー元アドレス(copy_p8)を設定する。
copy_p8 = OriBuff8 + ori_p8 -relativeBL; ・・・(17)
「OriBuff8」は、復元データ33が格納された領域の先頭を示すポインタである。その後、処理がステップS227に進められる。
[ステップS225]不一致符号が設定されている場合、符号解析部131は、復元する符号から、シフトバイト数、ストアブロック数、およびストアバイト数を取得する。その後、「code_p」で示す位置が、2バイト分先に進められる(code_p += 2)。
[ステップS226]ブロック取得部132は、圧縮データ32内のコピー元のブロックのアドレスを、コピー元アドレス(copy_p8)を設定する。例えばブロック取得部132は、以下の計算により、コピー元アドレス(copy_p8)を設定する。
copy_p8 = CodeBuff8 + (code_p / 8); ・・・(18)
「CodeBuff8」は、圧縮データ32が格納された領域の先頭を示すポインタである。その後、「code_p」で示す位置が、不一致記号列の次の符号の位置に進められる。例えば、以下の式により、「code_p」が更新される。
code_p+=storeBL*8+storeB-pre_storeB; ・・・(19)
[ステップS227]ブロック取得部132は、現在のストアバイト数(pre_storeB)よりもシフトバイト数(shiftB)の方が大きいか否かを判断する。シフトバイト数(shiftB)の方が大きければ、処理がステップS228に進められる。現在のストアバイト数がシフトバイト数以上であれば、処理がステップS229に進められる。
[ステップS228]ブロック取得部132は、コピー元アドレス(copy_p8)で示す位置のブロックと次のブロックとを取得し、ロード用レジスタ41,42に格納する。そして記号列生成部134が、シフトバイト数分シフトさせた値を、マージ用レジスタ43にコピーする。例えば、以下の命令により、ブロックの取得、シフト、およびコピーが行われる。
load_data2 = *(copy_p8); copy_p8++; ・・・(20)
load_data1 = *(copy_p8); copy_p8++; ・・・(21)
store_data = {(load_data2<<8*8) | load_data1)}>>(shiftB*8); ・・・(22)
「load_data2」は、ロード用レジスタ41への格納データを示す。「load_data1」は、ロード用レジスタ42への格納データを示す。「store_data」は、マージ用レジスタ43への格納データを示す。「*(copy_p8)」は、「copy_p8」で示される位置の1ブロックを取得することを示す。
式(20)により、コピー元の1ブロックが、ロード用レジスタ41に格納される。「copy_p8」で示されるアドレスをインクリメントして(copy_p8++)、式(21)の処理を行うことで、次の1ブロックが、ロード用レジスタ42に格納される。その後、「copy_p8」で示されるアドレスをインクリメントされる(copy_p8++)。そして、式(22)により、ロード用レジスタ41の内容を1ブロック左シフトさせた値と、ロード用レジスタ42の値とが結合され、さらにシフトバイト数分右にシフトした値が、マージ用レジスタ43に設定される。その後、処理がステップS230に進められる。
[ステップS229]ブロック取得部132は、コピー元アドレス(copy_p8)で示す位置のブロックを取得し、ロード用レジスタ42に格納する。そして記号列生成部134が、シフトバイト数分シフトさせた値を、マージ用レジスタ43にコピーする。例えば、以下の命令により、ブロックの取得、シフト、およびコピーが行われる。
load_data1 = *(copy_p8);copy_p8++; ・・・(23)
store_data = load_data1>>(shiftB*8); ・・・(24)
[ステップS230]記号列生成部134は、マージ用レジスタ43に格納した記号列と、未ストアバッファ44内の記号列とをマージする。例えば、以下の命令により、マージ処理を行うことができる。
store_data = (BLBuff & MASK1[pre_storeB])|(store_data & MASK2[pre_storeB]);
・・・(25)
「BLBuff」は、未ストアバッファ44の格納データを示す。「MASK1[]」は、以下のようなマスクデータである。
MASK1[] = {0x00 00 00 00 00 00 00 00,
0xFF 00 00 00 00 00 00 00,
0xFF FF 00 00 00 00 00 00,
0xFF FF FF 00 00 00 00 00,
...
0xFF FF FF FF FF FF FF FF}
「MASK1[pre_storeB]」により、現在のストアバイト数(pre_storeB)に応じたマスクデータが得られる。例えば、現在のストアバイト数(pre_storeB)が「7」であれば、「MASK1[pre_storeB]」は、「0xFF FF FF FF FF FF FF 00」となる。「BLBuff & MASK1[pre_storeB]」によって、未ストアバッファ44から、ストアバイト数分の記号列が抽出される。
「MASK2[]」は、以下のようなマスクデータである。
MASK2[] = {0xFF FF FF FF FF FF FF FF,
0x00 FF FF FF FF FF FF FF,
...
0x00 00 00 00 00 00 00 00}
「MASK2[pre_storeB]」により、現在のストアバイト数(pre_storeB)に応じたマスクデータが得られる。例えば、現在のストアバイト数(pre_storeB)が「7」であれば、「MASK2[pre_storeB]」は、「0x00 00 00 00 00 00 00 FF」となる。「store_data & MASK2[pre_storeB]」によって、マージ用レジスタ43の先頭から、ストアバイト数分の記号列が消去される。従って、式(25)により、ロード用レジスタ41,42からマージ用レジスタ43にコピーされた記号列と、未ストアバッファ44内のストアバイト数分の記号列とがマージされる。
[ステップS231]記号列生成部134は、ストアブロック数(storeBL)が0より大きいか否かを判断する。ストアブロック数が0より大きければ、処理がステップS232に進められる。またストアブロック数が0以下であれば、処理がステップS234に進められる。
[ステップS232]ブロック出力部135は、1ブロック分の記号列を復元データ33に追加する。例えば、以下の命令で、マージ用レジスタ43の先頭の1ブロックが、復元データ33に追加される。
OriBuff8[ori_p8] = store_data; ・・・(26)
その後、「ori_p8」の値がインクリメントされ(ori_p8 ++;)、「storeBL」の値がデクリメントされる(storeBL --;)。
[ステップS233]記号列生成部134は、コピー元の次のブロックを取得し、先に取得したブロックとマージする。そして記号列生成部134は、シフトバイト数分だけ、マージ用レジスタ43内の記号列を右にシフトする。このような処理は、例えば、以下の命令で実行される。
load_data2 = *(copy_p8);copy_p8++; ・・・(27)
store_data = {(load_data1<<8*8) | load_data2)}>>(shiftB*8); ・・・(28)
load_data1 = load_data2; ・・・(29)
式(27)により、次のブロックがロード用レジスタ41に格納される。式(28)により、ロード用レジスタ42内を記号列が左に1ブロック分シフトした値と、ロード用レジスタ41内の記号列とが、マージ用レジスタ43内にコピーされる。そして、マージ用レジスタ43内の記号列が、シフトバイト数分、右にシフトされる。式(29)により、ロード用レジスタ41内の記号列が、ロード用レジスタ42にコピーされる。その後、処理がステップS231に進められる。
[ステップS234]ストアブロック数が0以下になると、記号列生成部134は、マージ用レジスタ43の先頭の1ブロック分の記号列を、未ストアバッファ44に格納する。また記号列生成部134は、ストアバイト数(storeB)を、現在のストアバイト数(pre_storeB)に設定する。例えば、以下の命令が実行される。
BLBuff = store_data; ・・・(30)
pre_storeB = storeB; ・・・(31)
[ステップS235]符号解析部131は、圧縮データ32の復元が終了したか否かを判断する。例えば符号解析部131は、最後の符号の解析が終了した場合、復元が終了したと判断する。復元が終了した場合、ブロック出力部135が、未ストアバッファ44内の先頭からストアバイト数分の記号列を復元データ33に追加し、復元処理を終了する。復元が終了していなければ、処理がステップS222に進められる。
このようにして、レジスタを効率的に利用して、データを復元することができる。
以上説明したように、第2の実施の形態では、コピー元の記号列が属するブロックを相対ブロック数で指定しているため、データ復元時における復元データ33へのアクセスを、ブロック単位で行うことができる。これにより、コピー元の符号を符号(バイト)単位で読み出す場合に比べ、メモリアクセス回数を低減させることができる。その結果、データ復号処理時間が短縮される。
さらに、ブロック単位で読み出した記号列について、レジスタ内でシフト・マージといった簡単な処理を行うだけで、データを復元できる。しかも、符号内にシフト量などの情報が付加されているため、復元時にシフト量を計算する必要がなく、データ復元をさらに高速に行うことができる。
さらに、符号にストアブロック数やストアバイト数が含まれているため、コピーした記号列のどの範囲が復元されたデータなのかを、余分な計算を行わずに把握できる。そのため、復元時の処理負荷が軽減され、高速にデータを復元することができる。
〔その他の応用例〕
第2の実施の形態では、圧縮データ32の1つのブロックに、符号と不一致記号列とが混在している。そのため圧縮データからの符号の読み出しは、符号ごとに行っている。そこで、データ圧縮の際に、1つのブロックに符号をまとめて格納することで、圧縮データ32からの符号の読み出しも、ブロック単位で行うことが可能となる。
図14は、圧縮データの一例を示す図である。図14に示す圧縮データ32aでは、アドレス「0」のブロックに、4つの符号C1〜C4が格納されている。データの復元時には、例えば復元部130が、アドレス「0」のブロックを読み出し、レジスタに格納する。そして復元部130は、そのレジスタから符号を順番に解析し、データを復元することができる。また、アドレス「1」のブロックには、不一致記号列のみが格納されており、符号は格納されていない。データの復元時に不一致記号列を圧縮データ32aから読み出す際に、ブロック単位で読み出せば、そのブロックには不必要な符号が含まれないため、不一致記号列の読み出し効率が向上する。
また、第2の実施の形態では、圧縮部110と復元部130とをコンピュータ100で実現するものとしているが、圧縮部110または復元部130を、電子回路で構成することもできる。
なお、符号に設定する値を変更することも可能である。例えば相対ブロック数に代えて、参照部(辞書)の先頭からのブロック数を用いることもできる。この場合、参照部に含まれるブロック数から、符号に示されるブロック数番目のブロックに、一致した記号列の先頭の記号が含まれる。
以上、実施の形態を例示したが、実施の形態で示した各部の構成は同様の機能を有する他のものに置換することができる。また、他の任意の構成物や工程が付加されてもよい。さらに、前述した実施の形態のうちの任意の2以上の構成(特徴)を組み合わせたものであってもよい。
1 データ
1a 第1の記号列
1b 第2の記号列
1c 第3の記号列
1−1〜1−3 ブロック
2 データ圧縮装置
2a 探索手段
2b 符号化手段
3 記録媒体
3a 圧縮データ
4 データ復元装置
4a 符号取得手段
4ba,4bb レジスタ
4b 復元手段
5 記憶手段
5a 復元データ

Claims (20)

  1. 圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第1の記号列と記号の配列が一致する第2の記号列を探索する探索手段と、
    前記第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、前記第2の記号列を該符号に符号化する符号化手段と、
    を有するデータ圧縮装置。
  2. 前記符号化手段は、前記第1の記号列の先頭の記号が属するブロックのアドレスと、前記第2の記号列の先頭の記号が属するブロックのアドレスとの差分を、前記第1の記号列の先頭の記号が属するブロックを特定する情報とする、
    ことを特徴とする請求項1記載のデータ圧縮装置。
  3. 前記符号化手段は、前記第1の記号列の先頭の記号のブロック内での位置と、前記第2の記号列の先頭の記号のブロック内での位置とのずれ量を、前記第2の記号列の符号に含めることを特徴とする請求項1または2記載のデータ圧縮装置。
  4. 前記符号化手段は、前記第2の記号列の先頭の記号が属するブロックのアドレスと、前記第2の記号列の最後の記号が属するブロックのアドレスとの差分を、前記第2の記号列の符号に含めることを特徴とする請求項1乃至3のいずれかに記載のデータ圧縮装置。
  5. 前記符号化手段は、前記第2の記号列の最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分を、前記第2の記号列の符号に含めることを特徴とする請求項1乃至4のいずれかに記載のデータ圧縮装置。
  6. 前記符号化手段は、先に調査した範囲に記号の配列が一致する記号列がない第3の記号列に基づいて、一致する記号列がないことを示す情報を含む符号を生成し、前記第2の記号列の符号、前記第3の記号列の符号、および前記第3の記号列のコピーを含む圧縮データを生成することを特徴とする請求項1乃至5のいずれかに記載のデータ圧縮装置。
  7. 前記符号化手段は、前記第3の記号列の先頭の記号の、前記データのブロック内での位置と、前記圧縮データを複数のブロックに分けたときの、前記第3の記号列のコピーの先頭の記号の、前記圧縮データのブロック内での位置との差分を、前記第3の記号列の符号に含める、
    ことを特徴とする請求項6記載のデータ圧縮装置。
  8. 前記符号化手段は、前記第3の記号列の先頭の記号が属するブロックのアドレスと、前記第3の記号列の最後の記号が属するブロックのアドレスとの差分を、前記第3の記号列の符号に含めることを特徴とする請求項6または7記載のデータ圧縮装置。
  9. 前記符号化手段は、前記第3の記号列の最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分を、前記第3の記号列の符号に含めることを特徴とする請求項6乃至8のいずれかに記載のデータ圧縮装置。
  10. 前記符号化手段は、前記圧縮データを複数のブロックに分け、符号と前記第3の記号列のコピーとを、異なるブロックに格納することを特徴とする請求項6乃至9のいずれかに記載のデータ圧縮装置。
  11. 圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査した場合に、先に出現した第1の記号列と記号の配列が一致する第2の記号列が、前記第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号に符号化された圧縮データの先頭から順に、符号を取得する符号取得手段と、
    取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段に格納し、前記第2の記号列の符号を取得した場合には、前記第1の記号列の先頭の記号が属するブロックを特定する情報に基づいて、前記記憶手段から、復元された前記第1の記号列の先頭の記号が属するブロック以降の1以上のブロックを取得し、該1以上のブロックから前記第1の記号列をコピーして、前記第2の記号列を復元する復元手段と、
    を有するデータ復元装置。
  12. 前記圧縮データにおける前記第2の記号列の符号には、前記第1の記号列の先頭の記号が属するブロックを特定する情報として、前記第1の記号列の先頭の記号が属するブロックのアドレスと、前記第2の記号列の先頭の記号が属するブロックのアドレスとの差分が示されており、
    前記復元手段は、復元した前記第2の記号列が属するブロックのアドレスよりも、該差分だけ前のアドレスのブロック以降の1以上のブロックを、前記記憶手段から取得する、
    ことを特徴とする請求項11記載のデータ復元装置。
  13. 前記圧縮データにおける前記第2の記号列の符号には、前記第1の記号列の先頭の記号のブロック内での位置と、前記第2の記号列の先頭の記号のブロック内での位置とのずれ量が含まれており、
    前記復元手段は、前記記憶手段から取得したブロック内の前記第1の記号列の記号を、前記ずれ量だけシフトして、直前に復元された記号列と結合する、
    ことを特徴とする請求項11または12記載のデータ復元装置。
  14. 前記圧縮データにおける前記第2の記号列の符号には、前記第2の記号列の先頭の記号が属するブロックのアドレスと、前記第2の記号列の最後の記号が属するブロックのアドレスとの差分が含まれており、
    前記復元手段は、前記第2の記号列を復元したとき、該差分で示された数のブロックを前記記憶手段に格納することを特徴とする請求項11乃至13のいずれかに記載のデータ復元装置。
  15. 前記圧縮データにおける前記第2の記号列の符号には、前記第2の記号列の最後の記号が属するブロックの先頭から、該ブロック内での該最後の記号の位置までの差分が含まれており、
    前記復元手段は、前記第2の記号列を復元したとき、復元された記号列の後方から、該差分で示された範囲の記号列を保持し、該記号列の後方に、次に取得した符号に基づいて復元した記号列を結合することを特徴とする請求項11乃至14のいずれかに記載のデータ復元装置。
  16. 前記圧縮データには、先に調査した範囲に記号の配列が一致する記号列がない第3の記号列の符号と、前記第3の記号列のコピーとが含まれており、
    前記復元手段は、前記第3の記号列の符号を取得すると、前記圧縮データから、前記第3の記号列のコピーをブロック単位で取得する、
    ことを特徴とする請求項11乃至15のいずれかに記載のデータ復元装置。
  17. コンピュータが、
    圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第1の記号列と記号の配列が一致する第2の記号列を探索し、
    前記第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、前記第2の記号列を該符号に符号化する、
    データ圧縮方法。
  18. コンピュータが、
    圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査した場合に、先に出現した第1の記号列と記号の配列が一致する第2の記号列が、前記第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号に符号化された圧縮データの先頭から順に、符号を取得し、
    取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段に格納し、
    前記第2の記号列の符号を取得した場合には、前記第1の記号列の先頭の記号が属するブロックを特定する情報に基づいて、前記記憶手段から、復元された前記第1の記号列の先頭の記号が属するブロック以降の1以上のブロックを取得し、該1以上のブロックから前記第1の記号列をコピーして、前記第2の記号列を復元する、
    データ復元方法。
  19. コンピュータに、
    圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査し、先に出現した第1の記号列と記号の配列が一致する第2の記号列を探索し、
    前記第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号を生成し、前記第2の記号列を該符号に符号化する、
    処理を実行させるデータ圧縮プログラム。
  20. コンピュータに、
    圧縮対象のデータを、2以上の記号を含む複数のブロックに分け、該データ内の記号の配列を先頭から順に調査した場合に、先に出現した第1の記号列と記号の配列が一致する第2の記号列が、前記第1の記号列の先頭の記号が属するブロックを特定する情報を含む符号に符号化された圧縮データの先頭から順に、符号を取得し、
    取得した符号から順に元の記号列に復元して、復元した記号列をブロック単位で記憶手段に格納し、
    前記第2の記号列の符号を取得した場合には、前記第1の記号列の先頭の記号が属するブロックを特定する情報に基づいて、前記記憶手段から、復元された前記第1の記号列の先頭の記号が属するブロック以降の1以上のブロックを取得し、該1以上のブロックから前記第1の記号列をコピーして、前記第2の記号列を復元する、
    処理を実行させるデータ復元プログラム。
JP2013058644A 2013-03-21 2013-03-21 データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム Expired - Fee Related JP6048251B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2013058644A JP6048251B2 (ja) 2013-03-21 2013-03-21 データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム
US14/180,436 US20140289208A1 (en) 2013-03-21 2014-02-14 Data compression apparatus, data compression method, data decompression apparatus, and data decompression method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013058644A JP6048251B2 (ja) 2013-03-21 2013-03-21 データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム

Publications (2)

Publication Number Publication Date
JP2014183551A true JP2014183551A (ja) 2014-09-29
JP6048251B2 JP6048251B2 (ja) 2016-12-21

Family

ID=51569916

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013058644A Expired - Fee Related JP6048251B2 (ja) 2013-03-21 2013-03-21 データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム

Country Status (2)

Country Link
US (1) US20140289208A1 (ja)
JP (1) JP6048251B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111723053A (zh) * 2020-06-24 2020-09-29 北京航天数据股份有限公司 一种数据的压缩方法及装置、解压方法及装置

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10102215B2 (en) * 2015-03-27 2018-10-16 Intel Corporation Apparatus for hardware implementation of lossless data compression
CN108141225B (zh) * 2016-07-14 2020-10-27 华为技术有限公司 使用simd引擎的通用数据压缩
US11509328B2 (en) * 2018-05-31 2022-11-22 Microsoft Technology Licensing, Llc Computer data compression utilizing multiple symbol alphabets and dynamic binding of symbol alphabets
US11652495B2 (en) * 2021-09-14 2023-05-16 Mastercard International Incorporated Pattern-based string compression
CN117335810A (zh) * 2022-06-23 2024-01-02 加特兰微电子科技(上海)有限公司 数据压缩、解压缩方法及装置
CN117200803A (zh) * 2023-03-01 2023-12-08 山东华科信息技术有限公司 用于电力数据的数据解压缩系统

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0378322A (ja) * 1989-08-22 1991-04-03 Fujitsu Ltd データ圧縮方式
JP2000315954A (ja) * 1999-03-22 2000-11-14 Lucent Technol Inc 入力データストリームの圧縮方法とその装置
WO2009057459A1 (ja) * 2007-10-30 2009-05-07 Nec Corporation データ圧縮方法

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6535642B1 (en) * 1999-07-13 2003-03-18 Microsoft Corporation Approximate string matching system and process for lossless data compression
JP2001357048A (ja) * 2000-06-13 2001-12-26 Hitachi Ltd ブロックソート圧縮データの検索方法、および検索に適したブロックソート圧縮法の符号化方法
US6744388B1 (en) * 2002-06-19 2004-06-01 Xilinx, Inc. Hardware-friendly general purpose data compression/decompression algorithm
US8244677B2 (en) * 2004-01-23 2012-08-14 Elad Baron Focal point compression method and apparatus
GB0416481D0 (en) * 2004-07-23 2004-08-25 Hewlett Packard Development Co Method, apparatus and system for data block rearrangement for LZ data compression
US8417730B2 (en) * 2008-04-14 2013-04-09 Objectif Lune Inc. Block compression algorithm
US8688621B2 (en) * 2008-05-20 2014-04-01 NetCee Systems, Inc. Systems and methods for information compression
US8108353B2 (en) * 2008-06-11 2012-01-31 International Business Machines Corporation Method and apparatus for block size optimization in de-duplication
US8032495B2 (en) * 2008-06-20 2011-10-04 Perfect Search Corporation Index compression
US8447740B1 (en) * 2008-11-14 2013-05-21 Emc Corporation Stream locality delta compression
US8106799B1 (en) * 2009-03-23 2012-01-31 Marvell International Ltd. Data compression and decompression using parallel processing
US9195675B2 (en) * 2011-02-24 2015-11-24 A9.Com, Inc. Decoding of variable-length data with group formats
US8456331B2 (en) * 2011-04-15 2013-06-04 Cavium, Inc. System and method of compression and decompression
US20130099946A1 (en) * 2011-10-21 2013-04-25 International Business Machines Corporation Data Compression Utilizing Variable and Limited Length Codes
US9703796B2 (en) * 2011-12-06 2017-07-11 Brocade Communications Systems, Inc. Shared dictionary between devices
US9098202B2 (en) * 2012-04-27 2015-08-04 Hitachi, Ltd. Storage apparatus and data management method
US8812243B2 (en) * 2012-05-09 2014-08-19 International Business Machines Corporation Transmission and compression of genetic data

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0378322A (ja) * 1989-08-22 1991-04-03 Fujitsu Ltd データ圧縮方式
JP2000315954A (ja) * 1999-03-22 2000-11-14 Lucent Technol Inc 入力データストリームの圧縮方法とその装置
WO2009057459A1 (ja) * 2007-10-30 2009-05-07 Nec Corporation データ圧縮方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111723053A (zh) * 2020-06-24 2020-09-29 北京航天数据股份有限公司 一种数据的压缩方法及装置、解压方法及装置

Also Published As

Publication number Publication date
JP6048251B2 (ja) 2016-12-21
US20140289208A1 (en) 2014-09-25

Similar Documents

Publication Publication Date Title
JP6048251B2 (ja) データ圧縮装置、データ圧縮方法、およびデータ圧縮プログラム、並びにデータ復元装置、データ復元方法、およびデータ復元プログラム
JP5895545B2 (ja) プログラム、圧縮ファイル生成方法、圧縮符号伸張方法、情報処理装置、および記録媒体
US10044370B1 (en) Lossless binary compression in a memory constrained environment
WO2019153700A1 (zh) 编解码方法、装置及编解码设备
US8400335B2 (en) Using variable length code tables to compress an input data stream to a compressed output data stream
EP3120266B1 (en) Ozip compression and decompression
US9337863B1 (en) Methods and apparatus for rational compression and decompression of numbers
US8669889B2 (en) Using variable length code tables to compress an input data stream to a compressed output data stream
JP5812188B2 (ja) プログラム、圧縮データ生成方法、伸張方法、情報処理装置、および記録媒体
WO2014106782A1 (en) High bandwidth compression to encoded data streams
US20200294629A1 (en) Gene sequencing data compression method and decompression method, system and computer-readable medium
US20190052284A1 (en) Data compression apparatus, data decompression apparatus, data compression program, data decompression program, data compression method, and data decompression method
US8515882B2 (en) Efficient storage of individuals for optimization simulation
US20130262808A1 (en) Compression and decompression system, compression apparatus, decompression apparatus and compression and decompression method
US10103747B1 (en) Lossless binary compression in a memory constrained environment
US10380240B2 (en) Apparatus and method for data compression extension
US9455742B2 (en) Compression ratio for a compression engine
US9479195B2 (en) Non-transitory computer-readable recording medium, compression method, decompression method, compression device, and decompression device
US8463759B2 (en) Method and system for compressing data
US8140488B2 (en) Reducing memory required for prediction by partial matching models
JP2016052046A (ja) 圧縮装置、伸長装置およびストレージ装置
US10681106B2 (en) Entropy sharing across multiple compression streams
US20150193462A1 (en) Control method and control device
US8373584B2 (en) Compressing and decompressing data
KR101705461B1 (ko) 문자열 압축 및 해제를 위한 방법 및 장치

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20151106

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20160720

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160809

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20161003

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: 20161025

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20161107

R150 Certificate of patent or registration of utility model

Ref document number: 6048251

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees