能登 要

札幌在住のiOSアプリ開発者。SwiftUI により分割されたデバイス間を縦横にやりとりできる考え方に転換しています。

iOSアプリ開発者。2009年のiPhoneアプリ開発開始時期から活動。開発言語のアップデートの中でSwiftUIおよび周辺技術に着目中。

データ圧縮とApple Archive

パーソナルコンピューターで利用される圧縮機能についてのシンプルな解説とiOS13,macOS11からのAppleArchiveについての読み物。

1) データ圧縮の略史

パーソナルコンピューターが一般的に普及したのは2021年から四半世紀前の1995年のWindows95発売とそれに続くインターネット普及期(1997〜)で、emailのやりとりでファイルの圧縮機能が使われるようになった。圧縮機能自体はインターネット普及機前に現在でも知られる圧縮ファイル形式が存在しておりemail普及と同時に一般化していった。

インターネット普及機前に目を向けると、パーソナルコンピューターの遠隔地への通信は電話回線を占有するうえに低速だった。ネットワークをオープンしたままにすることは、電話回線を占有したままになるのと同じなので遠隔地同士を接続した場合、そのまま通信料金として反映される。

初期のパーソナルコンピューター通信の利用者とっては切実な課題であり、結果、必要な情報を得るための接続先にアクセスできたならば、できるだけ早く必要な情報を手に入れ、回線を切断し通信コストを削減できる手法が発達した。

必要な情報に挙げた中にアプリも含まれる。アプリは一般にテキストベースの情報に比べてデータサイズが大きく、複数のファイルで構成される場合が多かったので(プログラムにマニュアル、更新履歴で最低3ファイルは必要)、複数をファイルを扱いやすくかつデータサイズを減らす必要があった。圧縮機能の需要に対して多様な圧縮形式が開発され2021年まで続く圧縮ファイル形式も存在している。

2)機能形式の種類

大まかに2種類存在している。

  1. 圧縮データを元の状態に展開できる形式(可逆圧縮)
  2. 元データとは異なるが目的を達することができる形式(非可逆圧縮)が

可逆圧縮はコンピューターが正確なデータを要求するもの(アプリ、テキスト)はもれなく当てはまる。他方、非可逆圧縮は完全に再現が求められないもの(人間が視聴してオリジナルと区別がつかないもの、データの一部が欠損しても影響が少ない)が当てはまる。

非可逆圧縮は映像データや、音楽データ、写真データで採用されることが多い。映像や静止画、音楽は人間が視聴するが人間の目や耳は感度が鈍感な帯域があるためオリジナルデータでなくても視聴体験としては変わらないという理論に基づいて開発されている。 非可逆圧縮はオリジナルの再現性を失いはしたが一部データ欠損した場合への対応できる、可逆圧縮よりもデータサイズをさらに小さくできるなど長所は多い。

非可逆圧縮については、複数の要素が組み合わさって成り立っているので以後の内容では割愛し、パーソナルコンピューターの計算能力が発揮される可逆圧縮について記述する。

3)可逆圧縮の基本

圧縮機能で、データサイズが小さくなる仕組みのアイデアはデータの中に一定のパターンが存在し、よく出てくるパターンに短い表現を割り当てることで成り立つ。出現率が多いパターンに短い表現を割り当て、符号を参照するテーブルさえあれば、結果としてデータそのものは少なくすることができる。

アルファベットや10進数では特定のパターンが出てこない印象を受けるが、コンピューターで扱う値は2進数まで分解可能な結果、1と0の組み合わせで表すことができる。

1と0であれば、

000000
111111
101010

といったパターンが考えられる。もし000000が頻繁に出るのであれば、

0が6回出現

という表現が可能となる。日本語で表現できる箇所はコンピューターが理解できれば良い。ここで日本語の箇所を*1文字で置き換えることができると仮に決めたとすると、

0*6

となりデータを節約することができるというのが可逆圧縮の基本的なアイデアとなる。

可逆圧縮は圧縮率もしくは処理速度のどちらかを重視するかで多様なアルゴリズムが考案されている。今回の例はレンレングス圧縮と言われるアルゴリズムとなっている。

4)LZW - gif形式に使用された圧縮アルゴリズム

1990年代から今でも使われている画像形式gifで使われている可逆圧縮のためのアルゴリズムがLZWである。特徴としては圧縮率はそこそこ、圧縮と展開スピードの向上が図られている。

Lempel–Ziv–Welch - Wikipedia

圧縮アルゴリズムの代表としてlzwアルゴリズムをあげたのは、gif形式のエンコーダー/デコーダーを実装した経験があるためである。1990年代のコンピューターでも処理速度と省メモリで実装できた記憶がある。

5) AppleArchive

2020年にAppleが公開したiOS/iPad/macOS用アプリ開発向けアーカイブライブラリである。

Apple Archive | Apple Developer Documentation

特徴としては、

  • 一般的な圧縮形式とは別フォーマットとなっている
  • カスタム情報を付加可能
  • マルチプロセッサーを使用しての圧縮がデフォルト
  • 既存の圧縮アルゴリズム(lz4,lzma,zlib)にも対応しているがAppleとしてはlzfseの使用を奨励

lzfseはAppleがオープンソース化した圧縮形式で、平均的な圧縮率を誇りつつApple Aシリーズ,Apple Mシリーズ向けに高速化が図られている。

GitHub - lzfse/lzfse: LZFSE compression library and command line tool

アプリ開発向けに公開されている機能なので一般ユーザーは目にはしないがApple M1チップ搭載Macで約700MBの音声データを1.5秒程度で圧縮できる性能を持つ(同構成のIntel Core i7チップの2.19倍)。

用途としてはアプリ内での用途が主だと思われるが、用途の1つとしてDocument Packages形式(階層フォルダをファイルのように見立てる)を、クラウドサービスで公開するための圧縮形式として利用するといったことも考えられるかもしれない。

6) Apple Archiveを利用する際の注意点

2021年1月現在Xcode12.3を使う時点で問題が発生している。

問題とは実機用のビルでしかApple Archiveが有効にならなっていない。Apple ArchiveをimportしたプロジェクトをiPhone Simulator をターゲットとしてビルドするとApple Archiveのクラスライブラリが存在しない旨の警告が出てしまう。これがXcodeの問題なのか仕様なのかははっきりしていない。