説明

データ圧縮

【課題】ターミナルサービス環境において通信を行うためのデータ圧縮を提供する。
【解決手段】データ内の初期シーケンスと一致するLUT内のインデックスを見つけることでデータを圧縮する。LUTは複数のエントリを含み、各エントリは複数のインデックスの内の特定の1つを使用して発見できる。各エントリは対応するインデックスがヒストリバッファ内に置かれているかどうかを示す参照であり、もし置かれていれば、ヒストリバッファ内の対応するインデックスの1つまたは複数の位置を示す参照となる。マッチングインデックスの対応するエントリが複数の位置を参照している場合、各位置についてマッチングインデックスがあるシーケンスを初期シーケンスを含むデータ内のシーケンスと比較する。マッチングシーケンスは、複数の位置のそれぞれにあるシーケンスの長さ及び位置に基づく比較から導かれる。

【発明の詳細な説明】
【背景技術】
【0001】
本発明は、一般に、データ圧縮の分野に関するものであり、より具体的には、データ圧縮のためのシステム、サーバ、方法、およびコンピュータ読み取り可能な媒体に関するものである。
【0002】
増大の一途を辿るデータへのアクセスに使用される方法は、ますます多様化する一方である。例えば、ユーザは、Webサイトにアクセスして、コンサートイベントの放送、つまりWeb放送を受信することができる。さらに、ゲームおよびその他のアプリケーションについても、携帯電話を利用して無線ネットワーク経由でアクセスすることができる。このようなデータをユーザに提供するために、クライアントによるレンダリングのためにネットワーク経由でサーバからクライアントへデータをストリーミング配信することができる。ユーザは、その後、映画を見る、歌を聴くなどにより、レンダリングされたデータと対話することができる。
【0003】
データのストリーミング配信(Streaming data)は、ユーザがデータをすばやく受信できるような機能性の向上をユーザに提供する。ストリーミング配信でなければ、クライアントがデータを出力する前にサーバからデータの全量を受信する必要がある場合には、クライアント側でデータをレンダリングする際に、ユーザは遅れを感じるかもしれない。データをストリーミング配信することにより、ユーザが遭遇する遅延を減らすことができる。データのストリーミング配信は、データの「リアルタイム」レンダリングを提供するために使用することができる。
【0004】
データをストリーミング配信するために、一般的にはパケットを使用して、データをストリーミング配信でまたは連続的にサーバから伝送し、その後、データを含むファイル全体がクライアント側で使用可能になるまでレンダリングされないデータとは対照的に、データが到着したときにクライアント側でレンダリングする。ビデオデータ、オーディオデータ、メディアデータなどのさまざまな種類のデータにストリーミング配信を使用できる。ビデオデータのストリームは、伝送され、イメージが到達したときにレンダリングされる「動画」のシーケンスを提供する。同様に、オーディオデータのストリームは、オーディオデータが到着したときに再生される音声データを提供する。メディアデータのストリームは、オーディオデータとビデオデータの両方を含む。
【0005】
ストリーミングデータは、圧縮することにより、ネットワーク経由でデータをサーバからクライアントに効率よくストリーミング配信し、ストリーミング配信されたデータの有用性を高めることができる。例えば、通信によりサーバをクライアントに接続するネットワークは、帯域幅が限られていることがある。帯域幅が限られていると、サーバからクライアントに一時に通信できるデータの量が制限される場合があり、したがって、ネットワーク経由でデータをストリーミング配信したときにクライアントに提供される機能も制限される場合がある。例えば、ストリーミング配信されるビデオデータは、高帯域幅ネットワークが使用される場合の解像度に比べて、帯域幅が限られているためより低い解像度に制限されることがある。したがって、より高い解像度のストリーミングビデオデータを望むユーザは、否応なくさらに高い帯域幅の接続に投資せざるを得ない。ストリーミングデータを圧縮することにより、低い帯域幅のネットワーク経由で一度により多くのデータを転送することができ、したがって、ストリーミング配信されたデータの有用性が向上する。
【0006】
しかし、ストリーミングデータを圧縮する場合、データの集合全体の圧縮、例えばブロック圧縮とは対照的に、厄介な問題が加わることがある。例えば、映画全体を一度に圧縮するには、圧縮ルーチンが、データを圧縮するために、その映画を構成する全データ量を調べる場合がある。圧縮ルーチンは、映画を構成するデータ全体を通して含まれる共通のシーケンスの表現を提供することができる。しかし、ストリーミングデータは、データの「リアルタイム」レンダリングのために供給される。したがって、クライアントによるデータのリアルタイムレンダリングを提供するために、ストリーミングデータを分析する時間は、制限される可能性がある。さらに、共通のシーケンスの表現を提供するために、常に比較に利用できるデータの量も限られることがある。
【発明の概要】
【発明が解決しようとする課題】
【0007】
したがって、データ圧縮に対する継続的な必要性がある。
【課題を解決するための手段】
【0008】
データ圧縮について説明する。
一実施例では、クライアントからのリモートアクセスの要求に応じて送信されたデータや、ターミナルサービス環境でのデータなどをクライアントにストリーミング配信するために、データを圧縮する圧縮モジュールがサーバにより実行される。圧縮モジュールは、クライアントにすでにストリーミング配信されているデータを含むヒストリバッファを使用する。圧縮モジュールは、実行されると、ストリーミング配信されるデータ内のシーケンスとヒストリバッファ内の1つまたは複数のシーケンスとを比較して、マッチングシーケンスを見つける。ヒストリバッファ内のシーケンスの位置を特定するために、複数のインデックスのうちの1つでそれぞれ発見可能な複数のエントリを有するルックアップテーブルを使用する。これらのエントリのそれぞれは、対応するインデックスがヒストリバッファ内に置かれているかどうかを示す参照であり、もし置かれていれば、さらに、ヒストリバッファ内の対応するインデックスの1つまたは複数の位置を示す参照となる。したがって、圧縮モジュールは、ストリーミング配信されるデータ内の初期シーケンスをルックアップテーブルのインデックスとして使用し、ヒストリバッファ内のマッチングインデックスを見つけることができる。その後、データ内のマッチングシーケンスは、ヒストリバッファ内のマッチングシーケンスの位置および長さを記述する表現で置き換えられ、これによりクライアントにストリーミング配信する圧縮データを形成することができる。
【0009】
他の実施例では、方法は、サーバにより提供されるターミナルサービスからデータをクライアントにネットワーク経由で通信するためにリソースが使用可能かどうかを示すフィードバックを受け取ること、およびそのフィードバックに応じて、データを圧縮するために使用される圧縮ルーチンの1つまたは複数のパラメータをチューニングすることを含む。
【0010】
さらに他の実施例では、方法は、サーバを通じて利用可能なアプリケーションまたはファイルへのリモートアクセスの要求をクライアントからサーバで受け取ることを含む。ネットワーク経由で、その要求に応じてデータを伝達するためにリソースが使用可能であるかどうかが判別される。データを圧縮するために使用される圧縮ルーチンの1つまたは複数のパラメータは、上記判別されたリソースの使用可能性に基づいてチューニングされる。
【0011】
なお、説明の中の例において、同じ参照番号は、類似の構造およびコンポーネントを参照するために使用する。
【図面の簡単な説明】
【0012】
【図1】データがネットワーク経由でサーバからクライアントへストリーミング配信される環境を示す一実施例の図である。
【図2】図1のサーバおよびクライアントをさらに詳細に示している一実施例の図である。
【図3】ストリーミング配信するデータを圧縮用に構成する例示的な手順を示す流れ図である。
【図4】ストリーミング配信されるパケットへの参照を含むように構成されている図3のルックアップテーブルを使用してパケットを圧縮する例示的な手順を示す流れ図である。
【図5】伸張モジュールを実行することを通じてクライアントにより図4の圧縮されたパケットを伸張する一実施例の手順を示す流れ図である。
【図6】ストリーミング配信されるデータを含めるためヒストリバッファにおいてスライディングウィンドウが使用される一実施例の図である。
【図7】ストリーミングデータの圧縮をさらに最適化する一実施例の手順を示す流れ図である。
【図8】データ圧縮をさらに最適化するためにシーケンスの比較が最適化される一実施例の図である。
【図9】システムから受け取ったフィードバックに応じて圧縮が動的にチューニングされる一実施例のシステムの図である。
【発明を実施するための形態】
【0013】
・概要
データ圧縮について説明する。一実施例では、圧縮モジュールは、サーバからクライアントへストリーミング発信するデータを圧縮するためサーバにより実行される。圧縮モジュールは、クライアントにすでにストリーミング配信されているデータを含むヒストリバッファを使用する。圧縮モジュールは、実行時に、ストリーミング配信されるデータ内のシーケンスとヒストリバッファ内の1つまたは複数のシーケンスとを比較して、マッチングシーケンスを見つける。ヒストリバッファ内のシーケンスの位置を特定するために、複数のエントリを有するルックアップテーブルが使用される。これらのエントリはそれぞれ、複数のインデックスのうちの特定の1つを使用して発見可能である。各エントリは、対応するインデックスがヒストリバッファ内に置かれているかどうかを示す参照であり、もし置かれていれば、さらに、ヒストリバッファ内の対応するインデックスの1つまたは複数の位置を示す参照となる。したがって、圧縮モジュールは、ストリーミング配信されるデータ内の初期シーケンスをルックアップテーブルのインデックスとして使用し、エントリを1つ見つけることができる。このようにして、圧縮モジュールは、ヒストリバッファ内の各シーケンスをストリーミング配信されるデータ内のシーケンス毎に別々に比較することなく、初期シーケンスを有するヒストリバッファ内でそれぞれの位置をすばやく特定することができる。
【0014】
マッチングインデックスの対応するエントリが複数の位置を参照している場合、圧縮モジュールは、マッチングインデックスがある各位置のシーケンスを初期シーケンスを含むデータ内のシーケンスと比較することによりマッチングシーケンスを導出することができる。その後、データ内のマッチングシーケンスは、ヒストリバッファ内のマッチングシーケンスの位置および長さを記述する表現で表すことができる。その後、その表現を含む圧縮データを形成することができる。続いて、圧縮データはクライアントにストリーミング配信される。クライアントは、サーバからクライアントにすでにストリーミング配信されているデータも含んでいるヒストリバッファを使用することにより圧縮データを伸張する。クライアントは、伸張モジュールの実行を通じて、データを再構成するためにその表現により示される長さおよび位置を使用してクライアントのヒストリバッファ内のマッチングシーケンスを見つける。このようにして、データを失うことなくデータの圧縮および伸張を行うことができるような可逆データ圧縮技術が実現される。例えば、ビデオデータは、このデータ圧縮技術を使用することで、データの一部を失わずに、したがってビデオデータの解像度を維持して、圧縮および圧縮解除を行うことができる。
【0015】
・例示的環境
図1は、データがネットワーク106経由でサーバ102からクライアント104へストリーミング配信される環境100を示す一実施例の図である。クライアント104は、さまざまな方法で構成することができる。例えば、クライアント104は、図示されているようなデスクトップコンピュータ、および、移動局、娯楽機器、セットトップボックス、携帯電話などのネットワーク106経由で通信することが可能な装置として構成することができる。クライアント104は、さらに、クライアント104を操作する人および/またはエンティティ(entity)に関係していてもよい。つまり、クライアント104は、ユーザおよび/またはマシンを含む論理クライアントを記述しているとすることができる。1つのクライアント104が図示されているが、複数のクライアントをネットワーク106に通信可能に接続することができる。ネットワーク106は、インターネットとして図示されているが、さらに、イントラネット、有線または無線電話網などのさまざまな他のネットワークを含むこともできる。
【0016】
サーバ102は、ネットワーク106経由でデータをクライアント104にストリーミング配信するように構成されている。サーバ102は、クライアント104によるレンダリングのために、さまざまなストリーミングデータを供給する。一実施例では、サーバ102は、クライアント104にストリーミング配信されるコンサートのWeb放送を提供することができる。クライアント104によりレンダリングされると、ユーザはそのWeb放送を視聴できる。他の実施例では、クライアント104は、このクライアント104により出力するために、サーバ102からストリーミング配信される楽曲を含むデータを受信することができる。
【0017】
さらなる実施例では、サーバ102は、さらに、リモートアプリケーション実行用のターミナルサービス(terminal services)を提供することもできる。例えば、サーバ102は、複数のアプリケーション108(1)、…、108(n)、…、108(N)を含むことができるが、ただし、「n」は2から「N」までの任意のアプリケーションとすることができる。アプリケーション108(1)〜108(N)はそれぞれ、サーバ102上で実行される。サーバ102は、ネットワーク106経由で、アプリケーション108(1)〜108(N)を実行することを通じて供給される画面情報をクライアント104にストリーミング配信する。例えば、画面情報は、オペレーティングシステムにより与えられるデスクトップの表示、およびワードプロセッサの実行に関係する情報を表示するウィンドウ、ならびにオペレーティングシステムおよび/またはワードプロセッサにより与えられるオーディオ情報も含むことができる。
【0018】
サーバ102からストリーミング配信される画面情報は、ユーザが見られるようにクライアント104によりレンダリングされる。ユーザは、クライアント104と対話し、マウス108および/またはキーボード110などのクライアント104の入力デバイスを使用して入力することができる。入力は、キーボード110を使用することにより供給される、ワードプロセッサ用のテキスト入力などのレンダリングされた画面情報に対応することができる。それらの入力は、ネットワーク106経由でクライアント104からサーバ102へ通信される。入力は、サーバ102により受信されると、複数のアプリケーション108(1)〜108(N)を実行するときに使用することができる。例えば、ワードプロセッサは、ドキュメントに含めるためにテキスト入力を受け、画面情報をクライアント104にストリーミング配信して、このテキストを含むドキュメントを示すことができる。サーバ102上でのアプリケーション108(1)〜108(N)の実行と、画面情報のクライアント104へのストリーミング配信を通じて、クライアント104は、クライアント104自体では他の方法だと利用できない機能を利用することができる。
【0019】
例えば、クライアント104は、例えば、限られた処理および/またはメモリリソースを有する「シン」クライアントとして構成することができる。しかし、サーバ102は、例えば、クライアント104よりも処理および/またはメモリリソースの量をより多くもたせることにより、機能を豊富にすることができる。したがって、サーバ102は、クライアント104では実行できない、および/またはクライアント104で実行すると低速となるアプリケーションを実行することができる。サーバ102は、画面情報をクライアント104に送信することによりアプリケーション108(1)〜108(N)の1つまたは複数の実行結果をクライアント104に送り、ネットワーク106経由でクライアントから入力を受け取る。このようにして、処理リソース、メモリリソース、および複数のアプリケーション108(1)〜108(N)など、サーバ102が備える機能を、他の方法だとこの機能を利用できないクライアント104に提供することができる。
【0020】
ネットワーク経由でサーバ102とクライアント104間の通信を提供するために、サーバ102とクライアント104は、それぞれ、リモートデスクトッププロトコル(RDP)112、114を実装することができる。RDP 112、114は、すでに説明したようにアプリケーション108(1)〜108(N)に対しネットワーク接続を介したリモート表示および入力機能を提供するように設計されている。例えば、RDPを使用することにより、サーバ102からクライアント104にデバイス通信(device communication)およびプレゼンテーションデータを搬送する個別の仮想チャネルとともに、クライアント104からサーバ102に通信される暗号化された入力を可能にする。
【0021】
RDP 112、114は、さらに、圧縮および伸張モジュール116、118をサーバ102およびクライアント104のそれぞれに含めることにより帯域幅を削減することもできる。圧縮モジュール116はRDP 112の実装を通じてサーバ102により実行され、ネットワーク106経由でストリーミング配信する前にデータを圧縮することができる。同様に、伸張モジュール118はRDP 114の実装を通じてクライアント104により実行されることにより、ネットワーク106経由でサーバ102からストリーミング配信された圧縮データを伸張することができる。
【0022】
圧縮および伸張モジュール116、118は、実行時にそれぞれ、ネットワーク1006経由でストリーミング配信されるデータの圧縮および伸張を行う。すでに述べたように、ストリーミングデータの圧縮および伸張では、一度にデータセット全体の圧縮および伸張を行うのとは対照的に、つまりブロック圧縮とは対照的に、独自の複雑な状況をもたらす場合がある。例えば、データは「リアルタイム」でストリーミング配信することができるため、データのストリーミング配信に遅延が生じるとデータの有用性を低下させる場合がある。圧縮および伸張モジュール116、118では、ストリーミングデータの独自の複雑な状況に対処し、それにより、図3から5に関してさらに詳しく説明されているように、ネットワーク106経由で圧縮データのストリーミング配信を提供する。
【0023】
ターミナルサービス(TS)を使用することにより、クライアント104は、サーバ102にインストールされているアプリケーション108(1)〜108(N)のうちの1つまたは複数にアクセスし、サーバ102上のアプリケーションを実行し、クライアント104上にそのアプリケーションのユーザインターフェイス(UI)を表示することができる。アプリケーション108(1)〜108(N)はサーバ102上で実行されるため、TSにより、クライアント104は、クライアント104がクライアント104自体でリソースをローカルで実行するのに適したハードウェアおよびソフトウェアを有しているかどうかに関係なく、企業インフラのリソースを活用することができる。
【0024】
クライアント104は、複数のアプリケーション108(1)〜108(N)がサーバ102により実行されるターミナルサービス環境で説明しているが、クライアント104は、複数のアプリケーション120(1)、…、120(m)、…、120(M)のうちの1つまたは複数を実行することもできる。例えば、アプリケーション120(1)〜120(M)のうちの1つは、ユーザが見るために表示するデータをレンダリングし、マウス108および/またはキーボード110などのユーザからの入力を受け取るためにRDP 114とともに利用されるインターフェイスを備えることができる。さらに、圧縮および伸張モジュール116、118は、それぞれのRDP 112、114の一部として図示されているが、圧縮および伸張モジュール116、118は、それぞれストリーミングデータの圧縮および伸張のため実行されるスタンドアロンのソフトウェアコンポーネントとして構成することができる。
【0025】
さらに、以下の説明の一部では、ターミナルサービス環境における圧縮の使用について説明しているが、本明細書で説明している圧縮および伸張技術は、他のさまざまな環境でも利用することができる。例えば、この圧縮技術を使用することにより、リモートアクセス環境で使用されるデータを圧縮することができる。リモートアクセスとは、遠く離れた場所からコンピュータまたはネットワークにアクセスできることを表す。例えば、企業の遠隔地にある事務所では、企業のネットワークにアクセスすることを所望し、リモートアクセスを利用して、電話回線網、インターネットなどを経由し、そこに収容されているファイルおよびアプリケーションにアクセスする場合がある。サーバ102は、ネットワークにリモートでアクセスすることを求めているクライアントを処理するためにセットアップされている関連ソフトウェアを有するリモートアクセスサーバとして構成することができる。一実施例では、リモートアクセスサーバは、セキュリティ用のファイヤウォールサーバおよびリモートアクセス要求をネットワークの他の部分に転送するルータを含む。リモートアクセスサーバは、さらに、仮想プライベートネットワーク(VPN)の一部として使用することもできる。
【0026】
図2は、図1のサーバ102およびクライアント104をさらに詳しく示している一実施例200の図である。サーバ102は、プロセッサ202およびメモリ204を備える。RDP 112およびその個別の圧縮モジュール116は、プロセッサ202上で実行されているように例示され、メモリ204に格納可能である。同様に、クライアント104は、プロセッサ206およびメモリ208を備える。RDP 114およびその個別の伸張モジュール118は、プロセッサ206上で実行されているように例示され、メモリ208に格納可能である。
【0027】
サーバ102からクライアント104にストリーミング配信されるべきデータは、ビデオカメラ、マイクなどの入力デバイス210から受け取った、アプリケーション108(1)〜108(N)のうちの1つまたは複数の実行など、さまざまなソースから供給することができる。圧縮モジュール116は、サーバ102のプロセス202上で実行され、クライアント104にストリーミング配信するデータを圧縮する。そのデータは、サーバ102からクライアント104へパケットでストリーミング配信することができる。
【0028】
例えば、圧縮モジュール116は、所与の長さの未圧縮のシーケンスを有するデータを受け取り、そのシーケンスを、より小さな(現在圧縮されている)長さに圧縮すること、例えばバイト数、ビット数などを減らすことを試みることができる。圧縮モジュール116は、シーケンスを、置き換えられるシーケンスに比べて格納時に使用されるメモリリソースが少なくて済む、例えばバイト数の少ない表現で置き換えることにより、パケット毎にデータを圧縮することができる。
【0029】
圧縮モジュール116がシーケンスを圧縮できる場合、圧縮データがRDP接続の終点、つまりクライアント104のRDP 114に送信される。伸張モジュール118はクライアント104により実行され、圧縮データを伸張してデータを再構成する。圧縮モジュール116がデータを圧縮できない場合、データは、非圧縮形式で、つまりリテラルシーケンスでクライアント104にストリーミング配信することができる。圧縮モジュール116は、その後、サーバ102により実行され、後続のシーケンスの圧縮を試みることができる。
【0030】
データを圧縮するために使用される基本オペレーションは、以前にストリーミング配信されたシーケンスとともに圧縮されるデータ内のシーケンスのパターンマッチングを伴う。これを達成するために、圧縮モジュール116は、クライアント104にすでにストリーミング配信されているデータを収容しているヒストリバッファ212を維持する。圧縮モジュール116は、実行時に、ストリーミング配信されるデータ内のシーケンスとすでにクライアント104にストリーミング配信されているデータに含まれる1つまたは複数のシーケンスとを照合する。その後、ヒストリバッファ内のシーケンスと一致するストリーミング配信されるデータ内のシーケンスは、ヒストリバッファ212内のマッチングシーケンスを参照する1つまたは複数の表現を使用して表現することができる。これらの表現は、より小さい、つまり、圧縮する実際のシーケンス、すなわちマッチングシーケンスを格納するために使用されるメモリリソースよりも、使用するメモリリソースをより少なくすることができる。このことは、ストリーミング配信されるデータに含まれるデータの量を有効に低減する。
【0031】
ヒストリバッファ212を使用したパターンマッチングの基本例を例示するために、ヒストリバッファ212は、以下のシーケンスを含むと仮定する。
1 2 7 4 5 6 3 9 4 5 1 4 9 1
圧縮モジュール116は、サーバ102のプロセッサ202上で実行され、以下のシーケンスを受け取る。
4 5 9 7 4 5 6 3 9 4 5 1 4 6
圧縮モジュール116は、実行時に、圧縮されるデータ内のシーケンスと一致するヒストリバッファ内で最長のシーケンス、つまりマッチングシーケンス(matching sequence)を見つける。この場合、ヒストリバッファ内に現れるマッチングシーケンスは、以下では太字で示されている。マッチングシーケンスは、長さ10バイトで、ヒストリバッファ212の先頭から3バイトのところで始まる(左から開始し、0からカウントする)。
【0032】
【数1】

【0033】
したがって、圧縮モジュール116は、実行時に、ストリーミング配信されるデータを以下のように表現することにより、圧縮データを作成することができる。
4 5 9 (バッファの先頭から3バイトのところで始まる長さ10バイトの一致)

サーバ102では、ヒストリバッファ内のマッチングシーケンスを参照することにより、クライアント104にすでにストリーミング配信されているシーケンスを再送する必要はない。それ故に、圧縮モジュール116は、ストリーミング配信されるデータ内の繰り返しパターンを見つけて、この繰り返しパターン、つまりマッチングシーケンスを、ネットワーク106経由で送信されたときに使用するメモリリソースおよび帯域幅がより少ない表現で置き換えることにより、ストリーミング配信されるデータを圧縮する。
【0034】
圧縮データを伸張するために、クライアント104は、伸張モジュール118およびヒストリバッファ214を備える。クライアント104のヒストリバッファ214は、サーバ102のヒストリバッファ212のように、すでにストリーミング配信されているデータを格納する。したがって、伸張モジュール118は、クライアント104により実行されると、ヒストリバッファ214を使用することによりクライアント104にストリーミング配信されている圧縮データを伸張することができる。前の実施例の続きとして、クライアント104が以下のように示されている圧縮データを受け取ると仮定する。
4 5 9 (バッファの先頭から3バイトのところで始まる長さ10バイトの一致)

伸張モジュール118は、圧縮データに含まれる表現に基づき、実行時に、ヒストリバッファ214から圧縮されたシーケンスを取り出すことができ、これは、以下のように太字で示される。
【0035】
【数2】

【0036】
こうして、伸張モジュール118は、ヒストリバッファ214を使用して圧縮された文字列を伸張することができる。
【0037】
サーバ102は、ヒストリバッファ212内でマッチングシーケンスを見つけるためのルックアップテーブル216を備えることもできる。例えば、ルックアップテーブル216は、複数のインデックスのうちの対応する1つによりそれぞれ発見可能な複数のエントリを含むことができる。それぞれのエントリは、対応するインデックスを有するヒストリバッファ212内の各位置を記述する。したがって、圧縮モジュール116は、サーバ102により実行されると、ルックアップテーブル216を使用することによりヒストリバッファ212内の特定のシーケンスをすばやく特定することができる。ルックアップテーブル216およびヒストリバッファ212についてのさらなる検討は、図3〜4の関連で見出すことができる。
【0038】
サーバ102は、ハフマン符号化、算術符号化、プレフィクス符号化(Prefix encoding)、およびマルコフ符号化などの符号化技術を使用して、ストリーミング配信用にデータをさらに圧縮することもできる。例えば、ストリーミング配信されるデータは、ヒストリバッファ内のシーケンスと一致しないシーケンスを含むことができる。これらのシーケンスは、「リテラル」シーケンス(“literal”sequences)と呼ばれる。ハフマン符号化を使用して、データ内のリテラルシーケンスの一部または全部を圧縮すると、データをさらに圧縮することができる。例えば、ハフマン符号化は、さらに圧縮するそれぞれのリテラルシーケンスの出現度数を関連付ける出現度数テーブルから始めることができる。出現度数ケーブルは、データ自体および/または代表データから生成することができる。例えば、すでにストリーミング配信されているパケットを処理することでリテラルシーケンスの出現度数を求め、その後それを利用して、それぞれの後続のパケットを処理することができる。
【0039】
例えば、可変長文字列を、一意的なプレフィクス(prefix)などのその特定のリテラルシーケンスを一意に表すそれぞれのリテラルシーケンスに割り当てることができる。その後、その可変長文字列をツリー状に配列して、各リテラルシーケンスおよび表現をそれぞれ符号化および復号化する。リテラルシーケンスを符号化するために、符号化されるリテラルシーケンスをツリー内に配置する。リテラルシーケンスを含む葉を特定するために使用されるツリーの枝を利用して、リテラルシーケンスを符号化する、つまり、リテラルシーケンスの表現を与える。例えば、ハフマン符号化に使用されるツリーの各枝には出力アルファベットの記号、例えば、ビット0と1がマークされ、符号化は、ツリーのルートから符号化されるリテラルシーケンスまでの経路上の枝マーキングの列挙となる。各表現の復号化は、リテラルシーケンスを含むツリーの葉に到達するまで、可変長文字列内のそれぞれの連続する値に基づいて、ツリーをその原点から枝を通り下ってツリーの葉へと縦走(traversing)することによって行われる。
【0040】
リテラルシーケンスのハフマン符号化について説明してきたが、ハフマン符号化を使用することによりさらにさまざまなデータを圧縮することができる。例えば、ハフマンテーブル218では、リテラル222シーケンスおよびバックポインタ224の両方を符号化することができる。リテラルシーケンスは、すでに説明しているように、ヒストリバッファ212内に見つからないシーケンスを含む。したがって、ハフマンテーブル218を使用することで、リテラル222シーケンスを圧縮することができる。ハフマンテーブル218を利用してバックポインタ224も圧縮できる。バックポインタ224は、ヒストリバッファ212内の特定のシーケンスの位置を記述する。例えば、すでに説明しているように、ヒストリバッファ212内のシーケンスと一致するデータ内のシーケンス、つまりマッチングシーケンスは、「バッファの先頭からYバイトのところで始まる長さXバイトの一致」として記述することができる。バックポインタ224は、ヒストリバッファ212内のマッチングシーケンスの位置、つまりYバイトを記述する。ハフマンテーブル220を使用することにより、マッチングシーケンスの長さ分226、つまりXバイト分を圧縮することができる。
【0041】
サーバ102からクライアント104にストリーミング配信された圧縮データを伸張するために、それぞれサーバ102のハフマンテーブル218、220に対応するハフマンテーブル228、230を使用して、クライアント104により、伸張モジュール116が実行される。例えば、ハフマンテーブル228は、リテラル232シーケンスおよびバックポインタ234を伸張するために使用でき、一方、ハフマンテーブル230は、マッチングシーケンスの長さ226を伸張するために使用することができる。ハフマンテーブルのさらなる検討は、図7の関連で見出すことができる。
【0042】
サーバ102およびクライアント104は、さらに、それぞれLRU(last recently used:最も長い間参照されていない)テーブル236、238を含むこともできる。LRUテーブル236、238はそれぞれ、バックポインタが「最も長い間参照されていない」バックポインタのうちの1つであったかどうかに基づきバックポインタをさらに符号化するために使用することができる。例えば、LRUテーブル236は、それぞれ、最後の4つのバックポインタ毎に、LRU表現を与えるために使用することができる。LRU表現は、LRUテーブル236内で特定のバックポインタを特定するためのインデックスとして使用される。この方法で、繰り返されるバックポインタは、さらに圧縮することができる。LRUテーブルのさらなる検討は、図7の関連で見出すことができる。
【0043】
サーバ102からクライアント104にストリーミング配信されるデータの圧縮について説明しているが、クライアント104は、データを圧縮してサーバ102にストリーミング配信で送り返すこともできる。さらに、以下では、サーバ102からクライアント104にストリーミング配信されるパケットに関してデータの圧縮について説明しているが、データのさまざまな集合を使用して、サブパケットバイトシーケンス(sub‐packet byte sequences)、複数パケットなどのデータを圧縮することができる。さらに、以下では、バイトシーケンスについて説明しているが、ビットなど、データ内の他のシーケンスについても考慮されている。
【0044】
・手順の実施例
図3は、ストリーミング配信するデータを圧縮用に構成する例示的手順300を示す流れ図である。ブロック302で、データがヒストリバッファ212に追加される。例えば、ヒストリバッファ212は、ネットワーク106経由で図2のサーバ102からクライアント104にストリーミング配信された、かつ/またはストリーミング配信する準備ができている複数のパケット304(1)、304(2)を含むことができる。他の実施例では、パケット304(1)、304(2)は、圧縮モジュール116の実行によりすでに処理されているデータに対応することができる。
【0045】
サーバ102は、ストリーミング配信されるパケット304(3)を受信する。圧縮モジュール116は、サーバ102により実行されると、パケット304(3)をヒストリバッファ212に追加し、これによりヒストリバッファは、ストリーミング配信されたパケット304(1)、304(2)およびストリーミング配信されるパケット304(3)を含む。
【0046】
ブロック306で、圧縮モジュール116は、サーバ102により実行されると、ルックアップテーブル216を更新して、追加データ、つまりパケット304(3)を参照する。ルックアップテーブル216は、「k」を「1」から「K」までの任意のインデックスとし、複数のインデックス308(k)を含むように構成される。インデックス308(k)はそれぞれ、ルックアップテーブル216内の複数のエントリのうちのそれぞれ1つを発見するために使用される。各エントリは、複数のインデックス308(k)のうちの対応する1つがヒストリバッファ212内に置かれているかどうかを示す参照であり、もし置かれていれば、ヒストリバッファ212内の対応するインデックス308(k)の1つまたは複数の位置を示す参照となる。例えば、複数のエントリのうちの1つで、インデックス308(k)のうちの対応する1つを持つヒストリバッファ212内の複数の位置を参照することができる。複数の位置はそれぞれ、複数のハッシュチェーン310(k)のうちの対応する1つの使用を通じて説明されているように、図示されている。
【0047】
例えば、インデックス308(k)は、シーケンス「4 5」を持つものとして図示されている。ルックアップテーブル216内のインデックス308(k)の対応するエントリ、つまり、ハッシュチェーン310(k)は、ヒストリバッファ212内のインデックス308(k)「4 5」の各位置を記述する。例えば、パケット304(1)は、図3では、以下のシーケンスを持つものとして図示されている。
0 1 2 3 4 5 6 7
パケット304(2)は、図3では、以下のシーケンスを持つものとして図示されている。
8 9 4 5 3 1 3 0
図2のクライアント104にストリーミング配信されるパケット304(3)は、図3では、以下のシーケンスを持つものとして図示されている。
4 5 6 7 0 8 2 4
パケット304(1)〜304(3)は、以下のシーケンスが観察されるようにヒストリバッファ内に順次配列される。
0 1 2 3 4 5 6 7 8 9 4 5 3 1 3 0 4 5 6
7 0 8 2 4
ハッシュチェーン310(k)は、ヒストリバッファ212内のインデックス308(k)「4 5」のそれぞれの位置を記述する。各位置は、さまざまな方法で記述することができる。例えば、これらの位置は、ヒストリバッファ212の先頭から数え、番号0から始めたときのシーケンスの第1のバイトの位置として記述することができる。ハッシュチェーン310(k)は、ハッシュチェーン310(k)内の「1 6」からパケット304(3)の先頭まで図3において点線で示すように、ヒストリバッファ212内のシーケンスの先頭から16バイトのところにあるインデックス308(k)「4 5」の第1の位置を記述する。同様に、ハッシュチェーン310(k)は、ハッシュチェーン310(k)内の「1 0」からパケット304(2)の第3バイトまで図3において点線で図示されている、ヒストリバッファ212内のシーケンスの先頭から10バイトのところにあるインデックス308(k)「4 5」の第2の位置を記述する。さらに、ハッシュチェーン310(k)は、ヒストリバッファ212内の4バイトのところにあるインデックス308(k)「4 5」の第3および最終の位置を含む。したがって、ルックアップテーブル216は、ヒストリバッファ212内のインデックス308(k)の各位置、例えば、4、10、16を記述するハッシュチェーン310(k)を参照する対応するエントリを持つインデックス308(k)、例えば「4 5」を含む。ルックアップテーブル216を更新することにより、圧縮モジュール116は、実行時に、図4に関して後でさらに詳しく説明するように、より効率的な方法でストリーミング配信されるデータを圧縮することができる。
【0048】
各インデックス308(k)は、図3では、複数のハッシュチェーン310(k)のうちの対応する1つを持つものとして図示されているが、インデックス308(k)が対応するハッシュチェーンを持たない場合もある。例えば、場合によっては、ヒストリバッファ212がインデックスを含まないこともある。したがって、そのインデックスに対応するルックアップテーブル216内のエントリは、ハッシュチェーンを含み得ない。言い換えると、そのインデックスに対するハッシュチェーンは値0を持つ、つまり対応するインデックスを含む場所はヒストリバッファ212内にはないということである。さらに、複数のハッシュチェーン310(k)はそれぞれルックアップテーブル216内に含まれるように図示されているが、ハッシュチェーン310(k)の1つまたは複数をさまざまな方法で提供することができる。例えば、ルックアップテーブル216内の各エントリは、ルックアップテーブル216とは別の配列として構成される対応するハッシュチェーンへのポインタを含むことができる。
【0049】
図4は、ストリーミング配信されるパケット304(3)への参照を含むように構成されている図3のルックアップテーブル216を使用してパケット304(3)を圧縮する例示的手順400を示す流れ図である。ブロック402で、圧縮モジュール116は、実行時に、カレントポインタ404を、図3のブロック302のヒストリバッファ212に追加されたデータ、つまりパケット304(3)のところで開始する。
【0050】
ブロック406で、圧縮モジュール116は、サーバ102により実行され、カレントポインタ404が指す初期シーケンスと一致するルックアップテーブル216内のインデックスを見つける。例えば、圧縮モジュール116は、カレントポインタ404のところの2バイト、例えば「4 5」からなる初期シーケンスを使用して、その初期シーケンスと一致する複数のインデックス308(k)のうちの1つを見つけることができる。この例では、ルックアップテーブル216のインデックス308(k)「4 5」は、ヒストリバッファ212内のカレントポインタ404が指す初期シーケンス「4 5」と一致する。インデックス308(k)は、ヒストリバッファ212内のインデックス「4 5」308(k)の各位置を記述するハッシュチェーン310(k)を参照する対応するエントリをルックアップテーブル216内に持つ。したがって、その対応するエントリは、ヒストリバッファ212内の初期シーケンスの各位置を記述する。
【0051】
マッチングインデックス308(k)の対応するエントリが複数の位置を参照する場合、マッチングインデックス308(k)「4 5」を有するヒストリバッファ212内の各位置のシーケンスが、カレントポインタ404が指す初期シーケンスを有するデータ内のシーケンスと比較される。例えば、カレントポインタ404、つまりヒストリバッファ212内の位置「16」のところの初期シーケンス「4 5」、およびヒストリバッファ212内の位置「10」にあるシーケンスは、長さ「2」である、つまり、各位置のバイトシーケンス内の先頭2バイトのみで一方を他方と照合する。すでに述べたように、この実施例のハッシュチェーン310(k)内の位置は、ヒストリバッファ212の先頭から番号0を先頭番号として数えることで記述される。カレントポインタ404が指す初期シーケンスおよびヒストリバッファ212内の位置「4」のシーケンスは長さ「4」である。つまり、位置「4」にあるバイトシーケンス内の4バイトは、位置「4」のところのシーケンス内の4バイトに一致する。このようにして、マッチングシーケンス「4 5 6 7」は、計算で求められた長さから導かれる。最適なマッチングシーケンスを見つけるために、図7に関してさらに詳しく説明されているように、最大長が計算で求められ、かつ/またはしきい値に達するまで、ハッシュチェーン310(k)内の各位置を、圧縮されるデータのシーケンス、つまり、パケット304(3)と比較することができる。比較を最適化するため、次のバイトはシーケンス、例えば、初期シーケンスまたはヒストリバッファ212内のインデックスの後に続く1バイトを最初に比較することができるが、それは、最初の2バイトが一致すること照合から知られているからである。シーケンス内の「次の」バイトに基づく比較のさらなる検討が、図8の関連で見出すことができる。
【0052】
ブロック408で、マッチングシーケンスは、圧縮データを形成するために使用される表現で表される。例えば、パケット304(3)内のマッチングシーケンス「4 5 6 7」は、ヒストリバッファ212内のマッチングシーケンスの長さおよびマッチングシーケンスの位置を記述する表現で表すことができる。この表現は、タプル(tuple)、つまり指定された順序を持つ集まりとして形式化でき、{バックポインタ,長さ}という形式となる。バックポインタは、マッチングシーケンスの相対的位置をヒストリバッファ212内のオフセットとして記述することができる。例えば、バックポインタは、ヒストリバッファ212内におけるマッチングシーケンスの絶対的位置とカレントポインタ404の絶対的位置との間のオフセットとして相対的位置を記述することができる。この例では、マッチングシーケンスの絶対的位置は、ヒストリバッファ212内の位置4であり、カレントポインタ404の絶対的位置は、「16」である。したがって、マッチングシーケンスの相対的位置は、カレントポインタ404から12バイトのところである。長さは、マッチングシーケンスの長さを記述し、例えば「4」である。したがって、パケット304(3)を、マッチングシーケンス「4 5 6 7」を表現「{12,4}」で表すことにより圧縮し、圧縮データ、例えば、パケット410を形成することができる。他の実施例では、マッチングシーケンスの位置は、ヒストリバッファのマッチングシーケンスの絶対的位置、例えば、位置4から得られる。
【0053】
こうして、ルックアップテーブル216からは、ヒストリバッファ212内の各インデックス308(k)の各位置が得られる。したがって、圧縮モジュール116が実行されると、初期シーケンスのそれぞれの位置を、マッチングシーケンスを見つけるためにヒストリバッファ212内で個々のビットまたはバイトを「尋ね歩く」ことをせずに、ヒストリバッファ212内で見つけることができる。そのため、圧縮モジュール116は、ストリーミング配信されるデータを効率よく圧縮することができる。
【0054】
図5は、伸張モジュール128の実行を通じてクライアント104により図4の圧縮されたパケットを伸張する例示的な手順500を示す流れ図である。ブロック502で、クライアント104は、図4のサーバからクライアント104にストリーミング配信された、圧縮されたデータ、例えばパケット410を受け取る。
【0055】
ブロック504で、伸張モジュール128は、実行時に、クライアント104のヒストリバッファ214内のマッチングシーケンスを検出する。クライアント104のヒストリバッファ214は、サーバ102のヒストリバッファ212のように、サーバ102からクライアント104へストリーミング配信されているデータを含めることができる。そのため、圧縮データ、例えばパケット410が形成される前に、クライアント104のヒストリバッファ214は、サーバ102のヒストリバッファ212と一致する。したがって、伸張モジュール118は、実行時に、サーバのヒストリバッファ212内のマッチングシーケンスの長さおよび位置を記述する表現からクライアント104のヒストリバッファ214内のマッチングシーケンスを見つけることができる。前の実施例の続きとして、マッチングシーケンス「4 5 6 7」が、位置「12」で見つかるが、それは、すでに説明したように相対的位置である。
【0056】
ブロック506で、伸張モジュール118は、実行時に、この表現をマッチングシーケンスで置き換えて、データを再構成する。例えば、表現「{12,4}」は、マッチングバイトシーケンス「4 5 6 7」で置き換えられ、図4のブロック408で圧縮されたパケット304(3)のシーケンスと一致するシーケンス「4 5 6 7 0 8 2 4」を含むパケット508を形成する。例えば、圧縮データは、マッチングシーケンスの代わりに表現を含む新しいデータセットを形成することによりストリーミング配信されるデータから形成することができる。そのため、この実施例で示されるように、クライアント104は、ルックアップテーブル216を使用せずに圧縮データを伸張することができる。したがって、ストリーミング配信される圧縮データは、クライアント104がサーバ102に比べて削減されたハードウェアおよび/またはソフトウェアリソースを有する場合でも、クライアント104により伸張することができる。
【0057】
図3〜4に関連してそれぞれ説明した例示的な手順300、400では、ルックアップテーブル216は、複数のインデックス308(k)のそれぞれが2バイトを含むように構成されている。したがって、ルックアップテーブル216に、ホストバッファ212内のすべての2バイトシーケンスを記述している65,536個の対応するエントリを入れることができる。これにより、ルックアップテーブル216で直接、初期シーケンスを使用することができる。つまり、初期シーケンスは、対応するエントリを発見するためにルックアップテーブル216とともに使用するように変換されないということである。2バイトを持つインデックス308(k)について説明しているが、3バイトシーケンス、4バイトシーケンスなどのさまざまな長さのインデックスを使用することができる。
【0058】
図6は、ストリーミング配信されるデータを含めるためヒストリバッファ212でスライディングウィンドウが使用される一実施例600の図である。図3に関連して説明している実施例では、パケット304(3)がヒストリバッファ212に追加されている。その後、パケット304(3)を参照するために、ルックアップテーブル216が更新される。しかし、ヒストリバッファ212は、記憶容量が限れている場合がある。したがって、スライディングウィンドウを使用して、ヒストリバッファ212に新規追加データを含める。
【0059】
例えば、ヒストリバッファ212は、図3のブロック302でパケット304(3)を追加した結果としてシーケンス602を含めることができる。この実施例のヒストリバッファ212は、最大で24バイト格納することができる。したがって、8バイトあるシーケンス604を追加するために、圧縮モジュール116を実行してヒストリバッファ212の先頭から8バイトあるシーケンス606を取り除き、残りのシーケンスをヒストリバッファ212の先頭に移動させる。その後、新しいシーケンス604がヒストリバッファ212の末尾に追加される。シーケンスの移動と追加により、ヒストリバッファ212には、新規追加シーケンス604を含む24バイトあるシーケンス608を有することとなる。
【0060】
ルックアップテーブル216を更新してシーケンス608を反映させるために、ルックアップテーブル216内のハッシュチェーン310(k)内の各位置において、ヒストリバッファ212内でバイトのそれぞれがシフトされたバイト数に対応する数を減じることができる。例えば、この実施例では、バイトのそれぞれが8バイト分シフトされ、新しいシーケンス604用に空きが作られている。したがって、複数のハッシュチェーン310(1)〜310(K)によって記述されるそれぞれの位置は、その位置から「8」が減じられ、ヒストリバッファ212内の対応するインデックス308(k)の新しい位置を反映する。ヒストリバッファ212内にもはや含まれていないハッシュチェーン310(k)のそれぞれから位置を削除するために、0未満の値を持つ任意の位置をハッシュチェーン310(k)から削除する。
【0061】
図7は、ストリーミングデータの圧縮をさらに最適化する一実施例における手順700を示す流れ図である。図3〜4に関して説明した前の手順300、400では、ルックアップテーブル216は、ヒストリバッファ212内の初期シーケンスを効率よく特定するため対応するインデックス308(k)のヒストリバッファ212内の各位置を記述するように構成されている。ヒストリバッファ212内でマッチングシーケンスを見つけることをさらに最適化して、データ圧縮の効率をさらに高めることができる。
【0062】
例えば、ブロック702では、マッチングシーケンスは、ルックアップテーブルを使用し、またしきい値を使用して見つけられる。さまざまなしきい値が使用できる。例えば、マッチングシーケンスを見つけるための比較は、実行される比較の回数を制限するためヒストリバッファ内の所定の数の位置で実行するようにできる。ストリーミング配信されるデータと比較されるヒストリバッファ内の位置の数を制限することにより、位置のサイズ(例えば、バイト数)を制限することができる。例えば、すでに説明したように、ヒストリバッファ212内のマッチングシーケンスの位置は、マッチングシーケンスの先頭または末尾とカレントポインタの先頭または末尾との間の相対的位置として記述することができ、これはバックポインタにより記述することができる。したがって、実行される比較の回数を制限することにより、マッチングシーケンスは、カレントポインタの「より近く」に配置される可能性が高くなる。したがって、この「近さ」ゆえに、位置はより小さな値をもつことができ、例えば、使用するバイトをより少なくできる。他の実施例では、所定のしきい値を超える値を持つ位置を考慮しないような、またこの位置に対する値のサイズを制限する役目をすることができるようなしきい値を採用することができる。そのため、探索する位置の数、それぞれの位置を記述する値のサイズ、それぞれの配置されているシーケンスの長さを記述する値のサイズなど、さまざまなしきい値を使用することができる。
【0063】
決定ブロック704で、マッチングシーケンスの位置を記述するバックポインタが最も長い間参照されていない(LRU)テーブルに含まれているかどうかに関して判別する。LRUテーブルを使用して、最も長い間参照されていないバックポインタを格納することができる。マッチングシーケンスのバックポインタがLRUテーブルに含まれている場合、LRUテーブル内のバックポインタに対応するLRU表現は、マッチングシーケンスのバックポインタを符号化するために使用される。例えば、LRUテーブルは、4つの最も長い間参照されていないバックポインタがLRUテーブルに格納されるように深さ4(depth of four)を持つことができる。LRU内のバックポインタはそれぞれ、LRUテーブルへマッピングする対応するLRU表現を有する。したがって、バックポインタがLRUテーブルに含まれている場合、その後ブロック706で、バックポインタをLRUテーブルからのLRU表現を用いて符号化することができる。このようにして、圧縮モジュールは、ストリーミングデータ内に見つけられる追加パターンを処理して、さらにデータを圧縮することができる。例えば、サーバからクライアントにストリーミング配信されるグラフィックデータは、ヒストリバッファ内の類似のオフセットで繰り返されるマッチングシーケンスを含むことができる。したがって、マッチングシーケンスは、マッチングシーケンスの長さおよび位置を含み、その位置はさらにLRU表現を使用することにより圧縮される、表現を使用して圧縮することができる。
【0064】
バックポインタがLRUテーブルに含まれていない場合、次いでブロック708で、バックポインタを図2のハフマンテーブル228を使用して符号化することができる。ハフマン符号化は、さらに圧縮するそれぞれのバックポインタの出現度数を関連付ける出現度数テーブルから始めることができる。それぞれのバックポインタに、そのバックポインタを一意に表す可変長文字列が割り当てられる。例えば、それぞれの可変長文字列に一意的なプレフィクス(prefix)をもつことができる。その後、それらの文字列をツリー状に配列して、各バックポインタおよび表現をそれぞれ符号化および復号化することができる。バックポインタを符号化するために、バックポインタはツリー内に配置される。バックポインタを含む葉を特定するために使用されるツリーの枝を利用して、バイトシーケンスを符号化する、つまり、バックポインタの表現を与える。例えば、ハフマン符号化に使用されるツリーの各枝には出力アルファベットの記号、例えば、ビット0と1がマークされ、符号化は、ツリーのルートから符号化されるバックポインタまでの経路上の枝マーキングの列挙となる。各表現の復号化は、バックポインタを含むツリーの葉に到達するまで、文字列内のそれぞれの連続する値に基づき、ツリーをその原点から下へ枝を通りツリーの葉へとたどることによって実行される。
【0065】
ブロック710で、マッチングシーケンスの長さも、ハフマンテーブルを使用して符号化される。例えば、図2のハフマンテーブル230を使用して、ヒストリバッファ内のマッチングシーケンスの長さを符号化し、さらにデータを圧縮することができる。長さは、バックポインタについて説明されているとおりに符号化することができる。
【0066】
ブロック712で、マッチングシーケンスは、ヒストリバッファ内のマッチングシーケンスの位置およびマッチングシーケンスの長さを記述するバックポインタを含むタプルとして構成された表現により表される。ブロック714で、コスト関数を使用することにより、マッチングシーケンスに比べて、その表現がより効率的かどうか、例えば、使用されるメモリリソースが格納時により少なく、かつ/または使用される帯域幅がストリーミング配信時により小さいかを判別する。例えば、場合によっては、マッチングシーケンスに使用されるバイト数は、ヒストリバッファ内のマッチングシーケンスの位置および長さを記述する表現よりも少ない。したがって、コスト関数を使用して、表現またはマッチングシーケンス、つまり、データ内のリテラルシーケンスがより効率的かどうかを判別することができる。さまざまなコスト関数が使用できる。例えば、コスト関数は、バックポインタのサイズとマッチングシーケンスの長さのとの積を使用することができる。
【0067】
決定ブロック716で、その表現がより効率的である場合、次いでブロック718で、マッチングシーケンスをその表現で表すことにより圧縮データが形成される。ブロック720で、カレントポインタが更新され、次の初期シーケンスが処理される。例えば、カレントポインタは、マッチングシーケンスの長さずつ増分され、データ内の次のシーケンスについてこの手順を繰り返すことができる。ストリーミング配信するデータを通じてカレントポインタが増分されると、圧縮データは、クライアントにストリーミング配信される。
【0068】
決定ブロック716で、表現があまり効率的でない場合、ブロック722で、マッチングシーケンスはすでに説明したようにハフマンテーブルを使用して表される。ブロック720で、カレントポインタは、マッチングシーケンス内のバイト数ずつ増分され、次のシーケンスについてこの手順が続いて行われる。
【0069】
すでに説明しているように、ハフマンテーブルにより、ストリーミング配信されるデータをさらに圧縮することができる。バックポインタ、長さ、およびリテラルシーケンスをそれぞれ符号化するための3つのハフマンテーブルを説明してきた。他の実施例では、ハフマンテーブルを組み合わせることができる。例えば、図2に示されるように、ハフマンテーブル228を使用して、リテラル232バイトシーケンスおよびバックポインタ234を符号化することができる。圧縮ストリーム内のバックポインタとリテラルシーケンスとを区別するために、バックポインタおよびリテラルシーケンスに、それぞれの一意的なプレフィクスを与えることができ、例えば、それぞれのバックポインタがビット「0」から始まり、それぞれのリテラルシーケンスがビット「1」から始まるようにすることができる。他の実施例では、統一インデックスコード(unified index code)を使用して、バックポインタおよびリテラルシーケンスがそれぞれ異なる文字を有するように、リテラルシーケンスとバックポインタの両方を単一のアルファベットに組み合わせることにより、リテラルシーケンスとバックポインタの両方を符号化することができる。
【0070】
すでに説明してあるハフマンテーブルなどの符号化テーブルは、さまざまな方法で提供することができる。例えば、一実施例では、ストリーミング配信されるデータのパケット毎に符号化テーブルを計算する必要がないように、符号化テーブルを圧縮モジュールおよび伸張モジュールが使用するためにあらかじめ構成しておく。これを使用することにより、暗号化プロセスの速度を高めることができる。他の実施例では、符号化テーブルは、所定の間隔で動的に計算される。例えば、符号化テーブルは、所定の数のパケットを受信し符号化テーブルを更新する毎に再計算されるようにしてもよい。
【0071】
図8は、データ圧縮をさらに最適化するためにシーケンスの比較が最適化される一実施例800の図である。前述同様に、サーバ102は、ヒストリバッファ212およびルックアップテーブル216を備える。サーバ102は、圧縮モジュール116を実行して、パケット304(3)を圧縮する。ヒストリバッファ212の先頭から最初の2バイトが同じである最も右側のシーケンスの先頭までのオフセットを、i1=HASH[HASH_SUM(s)]と表すことができる。示されている実施例では、「s」は「4 5」に等しく、ヒストリバッファ212の先頭から数えゼロから始める場合、i1=10である。ヒストリバッファ212の先頭から次に最も右側のシーケンスまでの次のオフセットは、i2=NEXT[i1]と表すことができる。図8に示されている実施例では、ハッシュチェーン802(k)内でi2=NEXT[10]=4である。同様に、ヒストリバッファ212の先頭からの続く各オフセットは、i3=NEXT[i2]などハッシュチェーン802(k)内で表すことができる。示されている実施例では、「4 5」を含むヒストリバッファ212内にはほかにシーケンスがないためi3=0である。
【0072】
圧縮モジュール116は、実行時に、ヒストリバッファ212内の位置16にある「4
5」から始まるパケット304(3)を圧縮する手順を開始することができる。圧縮モジュール116は、まず、ハッシュチェーン802(k)の位置i1=HASH[HASH_SUM (’4’,’5’)]=10から初期シーケンス「4 5」を含むシーケンスをヒストリバッファ212内で特定することができる。この位置は記憶され、NEXT[16]は10に設定され、HASH[HASH_SUM(’4’,’5’)]は16に設定される。シーケンスは、最初にそれぞれのシーケンス内で次に続くバイトを比較することによって、現在位置(16)および位置i1(10)で、一方を他方と比較される。この場合、パケット304(3)内の第3バイトとパケット304(2)内の第5バイトとを比較して、一致を見つける。示されている実施例では、HISTORY[10+3]=’3’およびHISTORY[16+3]=’6’であるため、次に続くバイト(つまり、それぞれのシーケンス内の3番目のバイト)は異なる。したがって、期待されるマッチングシーケンスの長さは2のままであり、期待されるマッチングシーケンスの位置は10のままである。
【0073】
その後、圧縮モジュール116は、ルックアップテーブル216から位置i2=NEXT[i1]=4にある、ヒストリバッファ212内の次のシーケンスを特定することができる。i2はゼロに等しくないため、少なくとも2つのバイトの一致がある。それぞれのバイト「4 5」に続く次のバイトが前のように比較され、結果的に4バイトの一致が得られる。したがって、期待されるマッチングシーケンスの長さは4に設定され、期待されるマッチングシーケンスの位置は4に設定される。その後、圧縮モジュール116は、ハッシュチェーン802(k)から位置i3=NEXT[i2]=0にある、ヒストリバッファ212内の他のシーケンスを特定することができる。i3はゼロに等しいため、それはハッシュチェーン802(k)の末尾であり、他の位置は比較されない。一実施例では、圧縮モジュール116は、ハッシュチェーン802(k)の末尾を特にはチェックしないことに留意されたい。その代わりに、位置「i0」(図8に示す例では16)、NEXT[0]にあるシーケンスはi0に等しく設定される。したがって、ハッシュチェーン802(k)の末尾(iN=NEXT[i{N−1}]=0)に到達したときに、チェックされ、圧縮モジュール116はi{N+1}=NEXT[iN]=i0に進む。
【0074】
期待されるマッチングシーケンスの長さの後の続く「次の」バイトを比較することにより、比較速度を改善することができる。例えば、前の実施例では、HISTORY[i0+MatchLength]はHISTORY[i0+MatchLength]と比較された。ヒストリバッファ212内に比較すべき他のシーケンスがない場合、それぞれの位置にあるシーケンス全体の比較が実行される。つまり、ヒストリバッファ212内のそれぞれの位置にあるそれぞれのシーケンス内で、各バイトについて一方が他方と比較される。シーケンス全体の比較が成功すると、マッチングシーケンスが導かれる。このようにして、ヒストリバッファ212内のシーケンスの比較において、かなりのスピードアップを得ることができる。
【0075】
図9は、システムから受け取ったフィードバックに応じて圧縮が動的にチューニングされる一実施例におけるシステム900の図である。ネットワーク上のサーバ102とクライアント104間の通信は、さまざまなファクタにより変化する場合がある。例えば、クライアント104では、ソフトウェアおよび/またはハードウェアリソースの制限があり、クライアント104でのデータの伸張は、サーバ102での圧縮よりも時間が長くかかる場合がある。他の実施例では、サーバ102は、データを複数のクライアントに供給するので、クライアントは、サーバ102がそれらのクライアントのそれぞれのためにデータを圧縮できる速度よりも、高速にデータを伸張することができる。すでに説明した圧縮パラメータの1つまたは複数をチューニングすることにより、サーバ102とクライアント104のハードウェアおよび/またはソフトウェアリソースならびにそれらを通信可能に接続するネットワーク106のリソースを考慮に入れ、サーバ102とクライアント104間の通信を最適化することができる。例えば、サーバ102がクライアント104に圧縮データを送信するのを「待機している」場合、サーバ102は、追加圧縮計算を実行して、さらにデータを圧縮することができる。
【0076】
RDP 112の圧縮モジュール116のパラメータをチューニングするために、フィードバックを求める。さまざまなファクタをフィードバックとして使用し、一般的なネットワーク特性などの圧縮パラメータをチューニングすることができる。例えば、圧縮モジュール116が、低速なリンクであるためネットワークの逆圧(backpressure)が生じていることを示すネットワークレイヤからの情報を使用して、さらにデータを圧縮するにはさらに時間がかかることを示すことができる。したがって、逆圧がある場合、最終的な出力サイズの削減のためデータの圧縮にさらに時間をかけるように、圧縮モジュール116を動的にチューニングすることができる。
【0077】
他の実施例では、RDP 112は、ヒストリバッファ904(1)、…、904(h)、…、904(H)の固定プール902を利用することができる。データを送信しなければならない上位レイヤは、プール902にバッファ(例えば、バッファ904(h))を要求すること(割り当てること)、バッファ904(h)にデータを埋め込むこと(データを圧縮することを含む)、その後圧縮されたデータをクライアント104に送信することで動作する。バッファ904(h)は、バッファのコンテンツが送信されている場合のみ、プール902に戻される、つまり「解放される」。この技術により、RDP 112、より具体的には圧縮モジュール116は、バッファを「解放して」バッファプールに戻すのに要する時間の長さに基づいて、ネットワーク接続が低速であるか、または高速であるか(例えば、帯域幅の大きさ)、クライアントが低速であるか、または高速であるか(例えば、クライアントがデータを伸張するのに要する時間)などに関するフィードバック、つまり逆圧情報(backpressure information)を取得することができる。
【0078】
さらに他の実施例では、プール902のバッファ904(1)〜904(H)のどれもが使用できない場合、圧縮にさらに時間をかけるようにさまざまな圧縮しきい値をチューニングすることにより、圧縮モジュール116を「いっそう働く」ように適合させることができる。いったんネットワーク状態が改善されたら、圧縮モジュール116をチューニングして、データの送出がさらに速くなるように圧縮動作回数を減らすこともできる。例えば、ネットワーク106に使用可能な帯域幅がかなりある場合、データ通信にかかる時間を短縮する必要がないため、実行される圧縮動作の回数を減らすことができる。このように、変動するネットワーク状態に基づき実行時に圧縮パラメータが変更されるように動的な技術を採用することができる。他の実施例では、ネットワーク速度の初期測定を利用してパラメータをチューニングし、その後、これらのパラメータをセッション全体で使用する。
【0079】
すでに述べたように、圧縮モジュール116のチューニングに使用されるファクタについては、サーバ102のハードウェアおよび/またはソフトウェアリソースも考慮に入れることできる。例えば、サーバ102上の負荷を考慮に入れることができ(例えば、どれくらいのアクティブセッションがサーバ102により提供されているか、図2のプロセッサ202上の負荷など)、圧縮の強さを動的にチューニングし、圧縮でCPUをあまり使わないことにより補償することができる。チューニングできる圧縮パラメータの一例として、検索ウィンドウのサイズがある。例えば、検索ウィンドウのサイズを64Kから512Kまででチューニングすることができる。ウィンドウのサイズを大きくすると、相対的圧縮度が高くなるが、実行が遅くなることがある。したがって、ネットワークが低速であるとみなされる場合には、大きなウィンドウに「切り換える」と都合がよい。
【0080】
圧縮モジュール116をチューニングするために使用されるファクタの他の例では、一致を探すためにトラバースされるハッシュチェーン内のリンクの数をチューニングすることができる。例えば、長いチェーンリンクを辿ると、より長い一致が見つかる確率が高まるが、照合を実行するのに追加のハードウェアおよび/またはソフトウェアリソースのコストがかかる場合がある。
【0081】
圧縮モジュール116をチューニングするために使用されるファクタのさらなる例は、検索を終了するために見つかった最長一致を指定するしきい値である。すでに説明しているように、しきい値を使用することにより、一致を見つけるために実行される検索の回数を制限することができる。このしきい値が大きいほど、より長い一致が見つかる確率が高まり、したがってデータの圧縮がさらに行われる。しかし、この検索を実行する場合、さらに多くの処理リソースが使用される場合もある。さまざまなファクタおよびパラメータについて説明してきたが、他のさまざまなファクタおよびパラメータも、本明細書で説明したように使用することができる。
【0082】
本発明を、構造的特徴および/または方法論的動作に固有の専門用語で説明してきたが、添付の特許請求の範囲で規定する本発明は、説明した特定の機能または動作に必ずしも限定されるものではないことを理解されたい。むしろ、特定の機能および動作は、請求する本発明の例示的な実施形態として開示している。
【符号の説明】
【0083】
102 サーバ
104 クライアント
106 ネットワーク
108(1),108(n),108(N) アプリケーション
116 圧縮モジュール
118 伸張モジュール
120(1),120(m),120(M) アプリケーション
202 プロセッサ
204,208 メモリ
206 プロセッサ
210 入力デバイス
212,214 ヒストリバッファ
216 ルックアップテーブル
218 ハフマンテーブル
220,228,230 ハフマンテーブル
222 リテラルバイト
224 バックポインタ値
226 一致長
232 リテラル
236,238 LRUテーブル
234 バックポインタ

【特許請求の範囲】
【請求項1】
データを圧縮するための方法であって、
記憶手段に格納されているデータ内のシーケンスと一致する、ルックアップテーブル内のインデックスを検索するステップであって、前記ルックアップテーブルは、インデックスに対応する1つまたは複数の、前記記憶手段内の位置を有する、ステップと、
前記検索されたシーケンスに対応する位置が、LRU(Last Recently Used)テーブルにおいて参照されていない時間が最も長い複数の位置の1つと一致するかどうかを判別するステップであって、前記LRUテーブル中の各位置は、対応するシーケンスの位置を符号化するためのLRU表現を有し、かつ、以前ストリーミング配信されたデータ内のシーケンスが参照されていない時間が最も長い複数の位置の1つを示す参照となる、ステップと、
前記検索されたシーケンスの位置が前記LRUテーブルに含まれる場合は、前記LRUテーブルを参照し、対応するLRU表現を使用して前記検索されたシーケンスの位置を符号化し、かつ、第1のハフマン符号を使用して前記検索されたシーケンスの長さを符号化するステップであって、前記データは、前記検索されたシーケンスの位置および長さを符号化することにより圧縮される、ステップと、または、
前記検索されたシーケンスの位置が前記LRUテーブルに含まれない場合は、前記LRU表現を使用せずに、前記検索されたシーケンスの位置を符号化し、かつ、第1のハフマン符号を使用して前記検索されたシーケンスの長さを符号化するステップであって、前記データは、前記検索されたシーケンスの位置および長さを符号化することにより圧縮される、ステップと
を備えることを特徴とする方法。
【請求項2】
前記符号化された1つまたは複数の位置を含む圧縮データをストリーミング配信するステップをさらに備えることを特徴とする請求項1に記載の方法。
【請求項3】
前記インデックスを検索するステップは、前記検索されたインデックスの各位置を含むハッシュチェーンを参照することを特徴とする請求項1に記載の方法。
【請求項4】
前記シーケンスおよび前記インデックスは、それぞれ、少なくとも2バイトからなることを特徴とする請求項1に記載の方法。
【請求項5】
前記圧縮データは、1つまたは複数のパケットとして形成されており、前記パケットは、圧縮が各パケットごとに行われるようネットワーク経由送信のために圧縮されることを特徴とする請求項1に記載の方法。
【請求項6】
前記検索されたシーケンスの位置は、ハフマン符号化と、算術符号化と、プレフィクス符号化と、マルコフ符号化とからなるグループから選択された符号化技術を使用して符号化されることを特徴とする請求項1に記載の方法。
【請求項7】
前記インデックスを検索するステップでは、しきい値を使用して実行することを特徴とする請求項1に記載の方法。
【請求項8】
請求項1に記載の方法をコンピュータに実行させるためのコンピュータ実行可能命令を備えるプログラムを記録したコンピュータ読み取り可能な媒体。
【請求項9】
データを前記記憶手段に追加するステップと、
追加されたデータを前記ルックアップテーブルに含めるために前記記憶手段を参照するルックアップテーブルを更新するステップとをさらに備えることを特徴とする請求項1に記載の方法。
【請求項10】
データを圧縮するためのサーバであって、
記憶手段に格納されているデータ内のシーケンスと一致する、ルックアップテーブル内のインデックスを検索し、前記ルックアップテーブルは、対応するインデックスの1つまたは複数の、前記記憶手段内の位置を有する位置を有しており、
前記検索されたシーケンスの位置が、LRU(Last Recently Used)テーブルにおける最も長い間参照されていない複数の位置の1つと一致するかどうかを判別し、前記LRUテーブル中の各位置は、対応するシーケンスの位置を符号化するためのLRU表現を有し、かつ、以前ストリーミング配信されたデータ内のシーケンスの最も長い間参照されていない複数の位置の1つを示す参照となり、
前記検索されたシーケンスの位置が前記LRUテーブルに含まれる場合は、前記LRUテーブルを参照し、対応するLRU表現を使用して前記検索されたシーケンスの位置を符号化し、かつ、第1のハフマン符号を使用して前記検索されたシーケンスの長さを符号化する処理であって、前記データは、前記検索されたシーケンスの位置および長さを符号化することにより圧縮される、処理と、または、
前記検索されたシーケンスの位置が前記LRUテーブルに含まれない場合は、前記LRU表現を使用せずに、前記検索されたシーケンスの位置を符号化し、かつ、第1のハフマン符号を使用して前記検索されたシーケンスの長さを符号化する処理であって、前記データは、前記検索されたシーケンスの位置および長さを符号化することにより圧縮される、処理と
を実行するように構成されていることを特徴とするサーバ。
【請求項11】
前記サーバはさらに、前記符号化された1つまたは複数の位置を含む圧縮データをストリーミング配信するように構成されていることを特徴とする請求項10に記載のサーバ。
【請求項12】
前記サーバは、インデックスを検索する場合に、前記検索されたインデックスの各位置を含むハッシュチェーンを参照することを特徴とする請求項10に記載のサーバ。
【請求項13】
前記シーケンスおよび前記インデックスは、それぞれ、少なくとも2バイトからなることを特徴とする請求項10に記載のサーバ。
【請求項14】
前記圧縮データは、1つまたは複数のパケットとして形成されており、前記パケットは、圧縮が各パケットごとに行われるようネットワーク経由送信のために圧縮されることを特徴とする請求項10に記載のサーバ。
【請求項15】
前記検索されたシーケンスの位置は、ハフマン符号化と、算術符号化と、プレフィクス符号化と、マルコフ符号化とからなるグループから選択された符号化技術を使用して符号化されることを特徴とする請求項10に記載のサーバ。
【請求項16】
ネットワークと、
サーバであって、
複数のバイトを有する第1のヒストリバッファと、
複数のエントリを含むルックアップテーブルであって、前記エントリのそれぞれは複数のインデックスのうちの特定の1つを使用して発見可能であり、前記エントリのそれぞれは対応する前記インデックスが前記ヒストリバッファ内に置かれているかを示す参照であり、もし置かれていれば、前記ヒストリバッファ内の前記対応する前記インデックスの1つまたは複数の位置を示す参照である、ルックアップテーブルと、
前記ヒストリバッファ内のマッチングシーケンスの長さ分の符号を含む第1のハフマンテーブルと、
マッチングシーケンスの位置およびリテラルバイトを含む第2のハフマンテーブルと、
圧縮モジュールであって、
リモートアクセスの要求に応じてストリーミング配信されるデータ内のカレントポインタが指す初期シーケンスと一致する前記ルックアップテーブル内の前記インデックスの1つを見つけ、
前記マッチングインデックスの前記対応する前記エントリが1つまたは複数の前記位置を参照している場合、
前記マッチングインデックスを持つ前記位置のそれぞれのシーケンスと前記カレントポインタが指す前記データ内のシーケンスとを比較し、
前記比較からマッチングシーケンスを導き、
前記第1のヒストリバッファ内の前記マッチングシーケンスの前記位置および長さを含む表現を含むようにデータを構成し、前記第1のハフマンテーブルを使用してマッチングシーケンスの位置を符号化し、LRU(Last Recently Used)テーブルを使用してマッチングシーケンスの位置を符号化し、前記LRUテーブルは、最近のマッチングシーケンスの参照された複数の位置をリスト化しており、前記マッチングシーケンスの位置が前記LRUテーブルに存在しない場合は、前記マッチングシーケンスの位置が前記第2のハフマンテーブルを使用して符号化されて、前記マッチングシーケンスの前記長さだけ前記カレントポインタを進め、
前記マッチングインデックスの前記対応するエントリが前記位置をどれも参照しない場合、前記初期シーケンスを含むようにデータを構成し、前記第2のハフマンテーブルを使用して前記初期シーケンスのリテラルバイトを符号化して、前記初期シーケンスの長さだけ前記カレントポインタを進め、
前記カレントポインタが前記追加データを通じて進めたときに、前記ネットワーク経由で、パケット化済みの構成されたデータをストリーミング配信するようにサーバを実行させる圧縮モジュールと、を備えるサーバと、
前記サーバと通信するために、前記ネットワークに通信接続され、第2のプロセッサおよび第2のメモリを備え、第2のヒストリバッファ、マッチングシーケンスの位置およびリテラルバイトを復号化するための符号を含む第3のハフマンテーブル、マッチングシーケンスの長さ分を復号化するための符号を含む第4のハフマンテーブル、LRUテーブル、および、ストリーミング配信データを伸張可能にする伸張モジュールを備えるクライアントと、を備え、
前記クライアントは、前記構成されたデータを受信するように構成されており、
符号化された表現が前記構成されたデータに存在している場合、前記伸張モジュールに従ってクライアントは、前記LRUテーブル、前記第3のハフマンテーブルおよび前記第4のハフマンテーブルを使用して、前記表現により示される復号後の位置および復号後の長さに基づいて前記第2のヒストリバッファ内のマッチングシーケンスを見つけることにより、前記表現を復号するように構成されていることを特徴とするシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公開番号】特開2012−19532(P2012−19532A)
【公開日】平成24年1月26日(2012.1.26)
【国際特許分類】
【出願番号】特願2011−180783(P2011−180783)
【出願日】平成23年8月22日(2011.8.22)
【分割の表示】特願2005−28194(P2005−28194)の分割
【原出願日】平成17年2月3日(2005.2.3)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】