---
title: "圧縮形式検証（MongoDBのDumpがでかい！） | grasys blog"
url: "https://blog.grasys.io/post/yusukeh/compresstype/"
description: "grasysの代表しております長谷川です。 2019年、あけましておめでとうございます！ 本年もよろしくお願い致します！ 早速ですが、grasysではMongoDBの運用もしています。 ただMongoDBのDumpが非常に大きくて困っています。 Cloud使ってるからObject StorageにUploadしちゃえ…"
---

# 圧縮形式検証（MongoDBのDumpがでかい！）

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[yusukeh](/authors/yusukeh/)
-   公開日：2019年1月7日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#compress](/tags/compress/)

![圧縮形式検証（MongoDBのDumpがでかい！）](/_astro/ogp.Zlfm45oA_1IPS1W.webp)

grasysの代表しております長谷川です。

2019年、あけましておめでとうございます！  
本年もよろしくお願い致します！

早速ですが、grasysではMongoDBの運用もしています。  
ただMongoDBのDumpが非常に大きくて困っています。  
Cloud使ってるからObject StorageにUploadしちゃえばいいんですが！

**それにしても、やっぱでかい！！**

しかもMonboDBのDumpはBSONでバイナリ・・・

また自分は40歳といういい年のおっさんで、  
BSDとかSolarisとかも大好きな世代なので、今まであまり圧縮形式にこだわってきませんでした。

ちょっと調べてみると圧縮形式っていろいろあるのね

最近あんまりエンジニアできないので、年明け一発の今日！  
予定がない！  
だから遊び半分で検証！

**遊びなのでバイナリに強いとか、あまり深いこと考えてません！**  
**ただし本当のMongoDBのDumpのBSONで実施するぜ！**

blogは**たまに書く**、**社内にはダマで書く**を実施していこう！

* * *

## 検証する圧縮形式

-   gzip 1.5
-   lz4 v1.8.3
-   zstd v1.3.7

圧縮する速度が知りたいから、`bzip2`と`xz`はやらない！

### /etc/redhat-release

Plain textcontent\_copy

```
CentOS Linux release 7.6.1810 (Core)
```

### `uname -r`

Plain textcontent\_copy

```
3.10.0-862.14.4.el7.x86_64
```

* * *

## 圧縮するファイル

-   実際にMongoDBの`mongodump`で取得したもの
-   約13G (13676855970)

* * *

## Install

### gzip

CentOS7のRPM `gzip-1.5-10.el7.x86_64`

### lz4

source: [https://github.com/lz4/lz4](https://github.com/lz4/lz4)

Plain textcontent\_copy

```
declare module=lz4
declare version=1.8.3
declare download_url=https://github.com/${module}/${module}/archive/v${version}.tar.gz
declare download_to=/tmp/src/${module}-${version}.tar.gz
declare build_base=/usr/local/src/
declare build_dir=/usr/local/src/${module}-${version}
declare deploy_to=/usr/local/${module}-${version}
declare symlink_to=/usr/local/${module}

test ! -d ${build_base} && mkdir -p ${build_base}
test -d ${build_base} && \
  curl -s --create-dirs -o ${download_to}  \
  -L ${download_url}
test -f ${download_to} && tar -xvzf ${download_to} -C ${build_base}
test -d ${build_dir} && cd ${build_dir} && make && make install PREFIX=${deploy_to}
test -d ${deploy_to} && ln -s ${deploy_to} ${symlink_to}
test -x ${symlink_to}/bin/${module} && ${symlink_to}/bin/${module} -V
*** LZ4 command line interface 64-bits v1.8.3, by Yann Collet ***
```

yumのgroupで`Development Tools`が入ってれば、たぶん入るはず・・・

Plain textcontent\_copy

```
ldd ${symlink_to}/bin/${module}
	linux-vdso.so.1 =>  (0x00007ffe75dc2000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f564d0a9000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f564ce8d000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007f564cc89000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f564d682000)
```

### zstd

source: [https://github.com/facebook/zstd](https://github.com/facebook/zstd)

Plain textcontent\_copy

```
declare module=zstd
declare version=1.3.7
declare download_url=https://github.com/facebook/${module}/releases/download/v${version}/${module}-${version}.tar.gz
declare download_to=/tmp/src/${module}-${version}.tar.gz
declare build_base=/usr/local/src/
declare build_dir=/usr/local/src/${module}-${version}
declare deploy_to=/usr/local/${module}-${version}
declare symlink_to=/usr/local/${module}

test ! -d ${build_base} && mkdir -p ${build_base}
test -d ${build_base} && \
  curl -s --create-dirs -o ${download_to}  \
  -L ${download_url}
test -f ${download_to} && tar -xvzf ${download_to} -C ${build_base}
test -d ${build_dir} && cd ${build_dir} && make && make install PREFIX=${deploy_to}
test -d ${deploy_to} && ln -s ${deploy_to} ${symlink_to}
test -x ${symlink_to}/bin/${module} && ${symlink_to}/bin/${module} -V
*** zstd command line interface 64-bits v1.3.7, by Yann Collet ***
```

こっちもlz4のが通れば・・・たぶん・・・入るはず・・・  
というかオレのインスタンスは通ったから大丈夫！ｗ

一応参考

Plain textcontent\_copy

```
ldd ${symlink_to}/bin/${module}
	linux-vdso.so.1 =>  (0x00007fff2b0c5000)
	libz.so.1 => /lib64/libz.so.1 (0x00007ff3e83da000)
	liblzma.so.5 => /lib64/liblzma.so.5 (0x00007ff3e81b4000)
	liblz4.so.1 => /usr/local/lz4/lib/liblz4.so.1 (0x00007ff3e7fa1000)
	libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff3e7d85000)
	libc.so.6 => /lib64/libc.so.6 (0x00007ff3e79b8000)
	libdl.so.2 => /lib64/libdl.so.2 (0x00007ff3e77b4000)
	/lib64/ld-linux-x86-64.so.2 (0x00007ff3e87fc000)
```

`xz-libs-5.2.2-1.el7.x86_64` これとか必要そうね  
`/usr/local/lz4/lib/liblz4.so.1` これはオレがLD通したからだな

## 検証

### gzip

Plain textcontent\_copy

```
time gzip sample.bson

real	12m29.744s
user	12m3.196s
sys	0m10.310s
```

### lz4

Plain textcontent\_copy

```
time lz4 sample.bson

real	2m20.900s
user	0m34.440s
sys	0m10.606s
```

### zstd

Plain textcontent\_copy

```
time zstd sample.bson

real	7m11.140s
user	6m48.337s
sys	0m6.001s
```

## 結果

| 圧縮形式 | 圧縮real時間 | バイト | メガバイト |
| --- | --- | --- | --- |
| original | - | 13676855970 | 13044M |
| gzip | 12m29.744s | 2192892602 | 2092M |
| lz4 | 2m20.900s | 3663760871 | 3495M |
| zstd | 7m11.140s | 1929996789 | 1841M |

個人的にバランス良いなと思うのは`zstd`かな  
でもあんまり大きくなって、ウン百Gくらいのサイズになったら、`lz4`の方が良さげだな

`サイズ`なのか、`圧縮時間`なのか、どっちを取るかだな

でっかいファイルをパッと圧縮してポイッとObjectStorageにUploadしたいね〜

あ〜楽しかった！

## この記事を書いた人

[![](/_astro/yusukeh.BvUd2yKE_1mQ6Fp.webp)](/authors/yusukeh/)

### [yusukeh](/authors/yusukeh/)

Fly high. Think deep. Move fast. Go far.🦅

-   [Medium](https://medium.com/@yusukeh "Medium")

[プロフィールと記事一覧](/authors/yusukeh/)