tarball を作って zst・gz 形式に圧縮する場合と zip で圧縮する場合を比較する。

  • 全体の実行時間
  • 圧縮にかかる時間
  • 圧縮後のデータサイズ

圧縮部分の比較については、純粋な圧縮部分単体を図ることは難しいので、

  1. データを読み込んでそれを圧縮する
  2. データを読み込み何もしない

ストリームの実行時間をそれぞれ測り、1 から 2 を引いておおよその値を出す。

使用ライブラリと設定値

  • zip:
    • ライブラリ: node-archiver external_link
    • compression level: 9
      • 値を下げても速度に大きな変化はないという結果 が出たため、最大にしている
  • zstd:
  • gz:
    • ライブラリ: zlib
    • compression level: 指定していない (zlib.constants.Z_DEFAULT_COMPRESSION)
      • 現在は6?

結果まとめ

  • zip は archive と compress を同時に行うので、tarball を fs に出力しない分全体の実行時間は短い
  • 圧縮率は zstd と gz の方が zip よりも遥かに高い
    • ページの内容が全て同じ場合、内容が全てランダムの場合の両方で高かった
  • 圧縮にかかる時間は、zip のようにファイルひとつひとつを archive -> 圧縮するより、tarball 化してから圧縮する方が圧倒的に速い。
    • tarball の作成は再開可能で、export が中断された場合にここを再開可能にするメリットはありそう

ページの内容が全て同じ

3.24 GB (同じ内容 100000 ページ) の圧縮前のデータを用意

まとめ

ziptar.zsttar.gz
全体の実行時間82.2102104
圧縮にかかる時間46s4.46s10.2s
圧縮後のデータサイズ118MB1.03MB23.8MB

検証の詳細

zip

  • 全体の実行時間: 82.2s (5回平均)
  • 圧縮後のデータ量: 118MB

圧縮にかかる時間

  • mongo から page を読み込んで body を zip 化するストリームの実行時間 (5回平均): 66.4s
  • mongo から page を読み込むストリームの実行時間 (5回平均): 20.4s

圧縮する部分: およそ 46s (= 66.4 - 20.4)

zstd

  • 全体の実行時間: 102s (5回平均)
    • zip と比べてムラがあった: 137s, 103.2s, 75.2s, 101s, 91.2s
  • 圧縮後のデータ量: 1.03MB

圧縮にかかる時間

  • tar ball を fs から読み込んで zst 化するストリームの実行時間 (5回平均): 12.6s
  • tar ball を fs から読み込むストリームの実行時間 (5回平均): 8.14s

圧縮する部分: およそ 4.46s (= 12.6 - 8.14)

gz

  • 全体の実行時間: 104s (5回平均)
    • zip と比べてムラがあった: 138s, 128s, 80.0s, 72.4s, 102s
  • 圧縮後のデータ量: 23.8MB

圧縮にかかる時間

  • tar ball を fs から読み込むストリームの実行時間 (5回平均): 8.70s
  • tar ball を fs から読み込んで compress するストリームの実行時間 (5回平均): 18.9s

圧縮する部分: およそ 10.2s (= 18.9 - 8.70)

ページの内容が全てランダム

3.28 GB (ランダムな文字列で生成されたページ 100000 ページ) の圧縮前のデータを用意

まとめ

ziptar.zsttar.gz
全体の実行時間297s123s110s
圧縮にかかる時間167s0s16.3s
圧縮後のデータサイズ2.28GB1.29MB22.3MB

検証の詳細

zip

  • 全体の実行時間: 297s (5回平均)
    • 374s, 294s, 285s, 258s, 275s
  • 圧縮後のデータ量: 2.28GB

圧縮にかかる時間

  • mongo から page を読み込んで body を zip 化するストリームの実行時間 (5回平均): 190s
    • 204s, 188s, 216s, 175s, 169s
  • mongo から page を読み込むストリームの実行時間 (5回平均): 23.3s
    • 36.2, 26.0, 22.7, 16.1, 15.3

圧縮する部分: およそ 167s (= 190 - 23.3)

zstd

  • 全体の実行時間: 123s (5回平均)
    • zip と比べてムラがあった: 134s, 166s, 114s, 99.6s, 100s
  • 圧縮後のデータ量: 1.29MB

圧縮にかかる時間

  • tar ball を fs から読み込んで zst 化するストリームの実行時間 (5回平均): 10.3s
    • 17.7s, 8.02s, 7.79s, 9.34s, 8.69s
  • tar ball を fs から読み込むストリームの実行時間 (5回平均): 10.4s
    • 17.6s, 10.1s, 7.84s, 8.89s, 7.75s

圧縮する部分: およそ 0s? (= 10.3 - 10.4)

gz

  • 全体の実行時間: 110s (5回平均)
    • 115s, 118s, 106s, 105s, 104s
  • 圧縮後のデータ量: 22.3MB

圧縮にかかる時間

  • tar ball を fs から読み込むストリームの実行時間 (5回平均): 28.7s
    • 25.4s, 20.2s, 28.6s, 35.4s, 33.9s
  • tar ball を fs から読み込んで compress するストリームの実行時間 (5回平均): 12.4s
    • 15.6s, 10.9s, 9.45s, 11.3s, 14.8s

圧縮する部分: およそ 16.3s (= 28.7 - 12.4)

Commments