tarball を作って zst・gz 形式に圧縮する場合と zip で圧縮する場合を比較する。
- 全体の実行時間
- 圧縮にかかる時間
- 圧縮後のデータサイズ
圧縮部分の比較については、純粋な圧縮部分単体を図ることは難しいので、
- データを読み込んでそれを圧縮する
- データを読み込み何もしない
ストリームの実行時間をそれぞれ測り、1 から 2 を引いておおよその値を出す。
使用ライブラリと設定値
- zip:
- ライブラリ: node-archiver external_link
- compression level: 9
- 値を下げても速度に大きな変化はないという結果 が出たため、最大にしている
- zstd:
- ライブラリ: simple-zstd external_link
- compression level: 3
- 適当に選んだ
- 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 ページ) の圧縮前のデータを用意
まとめ
zip | tar.zst | tar.gz | |
---|---|---|---|
全体の実行時間 | 82.2 | 102 | 104 |
圧縮にかかる時間 | 46s | 4.46s | 10.2s |
圧縮後のデータサイズ | 118MB | 1.03MB | 23.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 ページ) の圧縮前のデータを用意
まとめ
zip | tar.zst | tar.gz | |
---|---|---|---|
全体の実行時間 | 297s | 123s | 110s |
圧縮にかかる時間 | 167s | 0s | 16.3s |
圧縮後のデータサイズ | 2.28GB | 1.29MB | 22.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