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%はかなり大きいですね。