0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

行指向JSONと列指向JSONのサイズ比較

Last updated at Posted at 2023-12-19

WebAPIなどで送受信するJSONのサイズを限界まで小さくしたいと思った時に、列指向のJSONにした方が圧縮後も含めて小さくなりそうでいいかもと思ったので簡単に実験してみたメモです。

行指向JSONの例

[{"d1":100, "d2":"aaa"}, {"d1": 101, "d2": "bbb"}]

列行指向JSONの例

{"d1": [100, 101], "d2": ["aaa", "bbb"]}

ダミーデータ生成プログラム

5000行分(1行2プロパティ)のデータを持つJSONを生成します。

import fs from 'fs'

// generate random number arrays
function gen(n, min_value, max_value) {
    var arr = [];
    for (var i = 0; i < n; i++) {
        arr.push(Math.floor(Math.random() * (max_value - min_value)) + min_value);
    }
    return arr
}

function genAlphabets(n, size) {
    var arr = [];
    for (var i = 0; i < n; i++) {
        var str = "";
        for (var j = 0; j < size; j++) {
            str += String.fromCharCode(97 + Math.floor(Math.random() * 5));
        }
        arr.push(str);
    }
    return arr
}

const d1 = gen(5000, 0, 1000)
const d2 = genAlphabets(5000, 5)

const json1 = JSON.stringify({
    d1,
    d2
})
fs.writeFileSync('column_based.json', json1)


// column based json
const json2 = JSON.stringify(d1.map((x, i) => {
    return {
        d1: x,
        d2: d2[i]
    }
}))
fs.writeFileSync('row_based.json', json2)
ファイル名 サイズ gzip(レベル6)圧縮後サイズ
列指向データ 59480 21345
行指向データ 119466 24127

この例では圧縮前で 50.2%、圧縮後で 11.5% 列指向JSONの方が小さくなりました。
WebAPIに送信するJSONの場合は圧縮されないことも多いので50%はかなり大きいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?