jsonを扱うときに前提条件が揃ってさえいれば、
容量をガツッと圧縮することができることを教えていただいたので、
それを実装して圧縮〜復元とやってみたのでメモ。
差分化圧縮
この圧縮方式をするための前提がいくつかあります。
・各行データが同じ構造ですべて数値であること
・ソート済みであること(これは圧縮効率に関係します)
圧縮の理屈としては、
自身の前の行のデータとの差分をデータとして出力することで、
元のデータ容量より小さく保存するというものです。
本記事のやり方では、pandasとnumpyを使用します。
コード
import pandas as pd
import numpy as np
import json
# テスト用データ作成
test_df = pd.DataFrame({
"col1": np.arange(1, 10),
"col2": np.arange(11, 20),
"col3": np.arange(21, 30),
"col4": np.arange(31, 40),
})
print(test_df)
"""
out
col1 col2 col3 col4
0 1 11 21 31
1 2 12 22 32
2 3 13 23 33
3 4 14 24 34
4 5 15 25 35
5 6 16 26 36
6 7 17 27 37
7 8 18 28 38
8 9 19 29 39
"""
# データ差分化圧縮させるため、先頭行に基準値として値が0のデータを用意
zero_data = [{"col1": 0, "col2": 0, "col3": 0, "col4": 0}]
test_df = pd.concat(
[pd.DataFrame(zero_data), test_df], ignore_index=False
)
# データ差分化圧縮
test_df = test_df.diff().dropna()
# 差分のint型変換
test_df["col1"] = test_df["col1"].astype(int)
test_df["col2"] = test_df["col2"].astype(int)
test_df["col3"] = test_df["col3"].astype(int)
test_df["col4"] = test_df["col4"].astype(int)
print(test_df)
"""
out
col1 col2 col3 col4
0 1 11 21 31
1 1 1 1 1
2 1 1 1 1
3 1 1 1 1
4 1 1 1 1
5 1 1 1 1
6 1 1 1 1
7 1 1 1 1
8 1 1 1 1
"""
# json変換
test_json = test_df.to_json(orient="values")
print(test_json)
"""
out
[[1,11,21,31],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
"""
# データ復元
test_json = np.array(json.loads(test_json)).cumsum(axis=0)
print(test_json)
"""
out
[[ 1 11 21 31]
[ 2 12 22 32]
[ 3 13 23 33]
[ 4 14 24 34]
[ 5 15 25 35]
[ 6 16 26 36]
[ 7 17 27 37]
[ 8 18 28 38]
[ 9 19 29 39]]
"""

20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!



コメント