This article needs additional citations for verification. (March 2021) |
| zlib | |
|---|---|
| 初回リリース | 1995年5月1日 (1995-05-01) |
| 安定版リリース | 1.3.1 [1]
/ 2024年1月22日 (22 January 2024) |
| リポジトリ |
|
| 書かれた | C |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | データ圧縮 |
| ライセンス | zlibライセンス |
| Webサイト | zlib.net |
zlib(/ ˈ z iː l ɪ b /または「zeta -lib」、/ ˈ z iː t ə ˌ l ɪ b /) [ 2] [3]は、データ圧縮およびデータフォーマットに使用されるソフトウェアライブラリです。 [4] zlibはJean-loup GaillyとMark Adlerによって書かれ、gzipファイル圧縮プログラムで使用されるDEFLATE圧縮アルゴリズムを実装しています。 zlibは、 Linux、macOS、iOSなど、多くのソフトウェアプラットフォームの重要なコンポーネントでもあります。 また、 PlayStation 4、PlayStation 3、Wii U、Wii、Xbox One、Xbox 360などのゲームコンソールでも使用されています。
Zlibの最初の公開バージョンである0.9は1995年5月1日にリリースされ、当初はlibpng画像ライブラリでの使用を目的としていました。これはフリーソフトウェアであり、zlibライセンスに基づいて配布されています。
機能
カプセル化
生のDEFLATE圧縮データ(RFC 1951)[5]は、通常、ヘッダーとフッターを追加することでデータをカプセル化するzlibまたはgzipラッパーを使用して記述されます。これにより、生のDEFLATEデータでは提供されないストリーム識別とエラー検出が可能になります。
zlibラッパー(RFC 1950)[4]はgzipラッパー(RFC 1952)[6]よりも小さく、後者はファイル名やその他のファイルシステム情報を格納するためです。
アルゴリズム
2018年9月現在、zlibはDEFLATE[update]と呼ばれるアルゴリズムのみをサポートしています。これは、 LZ77(Lempel–Ziv 1977)のバリエーションとハフマン符号化を組み合わせたものです。[7]このアルゴリズムは、システムリソースの使用を最小限に抑えながら、幅広いデータに対して優れた圧縮率を提供します。これは、 Zipアーカイブ形式にも使用されているアルゴリズムです。ヘッダーは他のアルゴリズムもサポートしていますが、現在実装されているものはありません。
資源利用
zlibは、プロセッサとメモリの使用を制御する機能を提供します。圧縮レベルを指定することで、速度と圧縮率をトレードオフできます。また、一部の組み込みシステムなど、メモリが制限された環境で役立つ、メモリを節約する機能も備えています。
戦略
圧縮は特定のデータタイプに合わせて最適化できます。ライブラリを使用して特定のデータタイプを常に圧縮する場合は、特定の戦略を使用することで圧縮率とパフォーマンスが向上する可能性があります。例えば、データに長いバイト列の繰り返しが含まれている場合、ランレングス符号化(RLE)戦略を使用すると、より高速で良好な結果が得られる可能性があります。一般的なデータの場合は、デフォルトの戦略が推奨されます。
エラー処理
圧縮データ内のエラーが検出され、スキップされる場合があります。さらに、圧縮ストリームに「フルフラッシュ」ポイントが書き込まれると、破損したデータはスキップされ、次のフラッシュポイントで解凍処理が再同期されます。ただし、破損データのエラー回復は提供されません。フルフラッシュポイントは、信頼性の低いチャネルで大量のデータストリームを送信し、多少のデータ損失が問題にならない場合(一部のマルチメディアアプリケーションなど)に有効です。ただし、フラッシュポイントを多数作成すると、圧縮速度だけでなく、圧縮率(圧縮率)にも影響が出る可能性があります。
データ長
圧縮または解凍できるデータの長さに制限はありません。ライブラリを繰り返し呼び出すことで、無制限の数のデータブロックを処理できます。一部の補助コード(カウンターなど)は、長いデータストリームを処理する際にオーバーフローが発生する可能性がありますが、実際の圧縮または解凍には影響しません。
長い (または無限の) データ ストリームを圧縮する場合は、定期的にフルフラッシュ ポイントを書き込むことをお勧めします。
アプリケーション
今日では、zlibは事実上の 標準となっており、標準文書ではzlibとDEFLATEが同じ意味で使われることが多く、何千ものアプリケーションが直接的または間接的に圧縮にzlibを利用しています。[8]これらには以下が含まれます。
- Linuxカーネルでは、zlib を使用して、圧縮されたネットワーク プロトコル、圧縮されたファイル システムを実装し、ブート時にカーネル イメージを解凍します。
- GNU BinutilsとGNU デバッガ(GDB)
- libpng はPNG画像形式のリファレンス実装であり、ビットマップデータのストリーム圧縮として DEFLATE を指定します。
- libwww 、 Web ブラウザなどの Web アプリケーション用の API 。
- zlib を使用してHTTP/1.1を実装するApache HTTP Server。
- 同様に、cURLライブラリはHTTPレスポンスを解凍するためにzlibを使用します。[9]
- OpenSSHクライアントとサーバーは、 Secure Shellプロトコルによって提供されるオプションの圧縮を実行するために zlib に依存しています。
- オプションで zlibを使用してTLS接続を圧縮できるOpenSSLおよびGnuTLSセキュリティ ライブラリ。
- FFmpegマルチメディア ライブラリ。zlib を使用して、 Matroskaなどのストリーム形式の DEFLATE 圧縮部分を読み書きします。
- オプションのプロトコル圧縮を実装するために zlibを使用する rsyncリモートファイル シンクロナイザー。
- dpkgおよびRPMパッケージ マネージャーは、zlib を使用して圧縮されたソフトウェア パッケージからファイルを解凍します。
- Apache SubversionおよびCVS バージョン コントロールシステム。これらは、zlib を使用してリモート リポジトリとの間のトラフィックを圧縮します。
- Apache ORC列指向データストレージ形式では、デフォルトの圧縮方法としてZLibが使用されます。[10]
- Gitバージョン コントロールシステムは、 zlib を使用してデータ オブジェクト (BLOB、ツリー、コミット、タグ) の内容を保存します。
- PostgreSQL RDBMS は、 データベースのバックアップにカスタム ダンプ形式 (pg_dump -Fc) の zlib を使用します。
- Microsoft .NET Framework 2.0以降のSystem.IO.Compression.DeflateStreamクラス。 [11]
- Wind River Systems社製のVxWorksオペレーティング システムの一部である TORNADO の「deflate」ユーティリティは、zlib を使用してブート ROM イメージを圧縮します。
- zlib-flate [12]生のzlib圧縮プログラム、qpdf [13]の一部
- MySQL RDBMSはInnoDB テーブルの圧縮にZLib LZ77を使用しています[14]
zlib は、コードが移植可能で、ライセンスが柔軟であり、メモリ フットプリントが比較的小さいため、Apple iPhoneや Sony PlayStation 3などの多くの組み込みデバイスでも使用されています。
フォーク
zlib は、古いコードベース上に構築されたよく使用されるライブラリであり、このライブラリの改善を主張するサードパーティによって 頻繁にフォークされています。
- Intelはzlibの高性能フォークを持っています。[15]
- Cloudflareは「大規模な」改善を加えた高性能フォークを維持しています。[16]
- zlib-ngは、「次世代」システム向けのzlib代替フォークです。ANSI Cをサポートしていないコンパイラ向けの回避策コードを削除し、CloudflareとIntelの最適化を統合し、ハードウェアアクセラレーション(SIMDおよび組み込み関数)を追加し、コードサニタイザー、ファジング、コードカバレッジを使用してバグの発見を支援します。[17]
参照
参考文献
- ^ Adler, Mark (2024年1月22日). 「[Zlib-announce] zlib 1.3.1 リリース」 . 2024年1月23日閲覧。
- ^ Stutz, Michael (2004年10月22日). 『Linuxクックブック 第2版:日常的な使用のためのヒントとテクニック』No Starch Press. ISBN 9781593270315. 2023年1月25日時点のオリジナルよりアーカイブ。2021年10月28日閲覧– Google Books経由。
- ^ Loki Software; Hall, John R. (2001年10月22日). 『Linuxゲームのプログラミング』No Starch Press. ISBN 9781886411494. 2024年7月11日時点のオリジナルよりアーカイブ。2021年10月28日閲覧– Google Books経由。
- ^ ab RFC 1950. doi : 10.17487/RFC1950 .
- ^ RFC 1951. doi : 10.17487/RFC1951 .
- ^ RFC 1952. doi : 10.17487/RFC1952 .
- ^ RFC 1951. doi : 10.17487/RFC1951 .
- ^ Gailly, Jean-loup; Adler, Mark (2002-04-18), zlib Applications, 2019-06-10にオリジナルからアーカイブ、2007-12-09に取得
- ^ 「c++ - cURL が zlib を使用するのはなぜですか?」。Stack Overflow。
- ^ “ORCFile in HDP 2: Better Compression, Better Performance”. 2013年9月6日. 2020年8月6日時点のオリジナルよりアーカイブ。 2020年5月16日閲覧。
- ^ System.IO.Compression.DeflateStream Archived 2016-02-06 at the Wayback Machine . MSDN ライブラリ。
- ^ – Debian一般コマンドマニュアル
- ^ “qpdf”. 2024年7月11日時点のオリジナルよりアーカイブ。2021年3月28日閲覧。
- ^ 「MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.9.1.5 InnoDBテーブルの圧縮の仕組み」dev.mysql.com . 2021年8月1日時点のオリジナルよりアーカイブ。 2021年7月14日閲覧。
- ^ “github Intel ZLIB”. github . 2024年1月25日. 2024年1月25日時点のオリジナルよりアーカイブ。 2024年1月25日閲覧。
- ^ 「がんとの闘い:コードをオープンソース化することの予期せぬメリット」Cloudflareブログ、2015年7月8日。2019年9月21日時点のオリジナルよりアーカイブ。 2020年1月18日閲覧。
- ^ Rosbach, HK (2023年2月24日). 「zlib-ng/zlib-ng: zlibの代替と「次世代」システム向け最適化」. GitHub . zlib-ng. 2020年4月20日時点のオリジナルよりアーカイブ。 2020年1月18日閲覧。
外部リンク
- 公式サイト