pythonでDBに保存するテキストを圧縮する(検討編)

 pythonでダウンロードしたものをデータベースに格納しているスクリプトがあるのだが、今までよりも極端に長いURLを保管しなくてはならなくなった。

でテキストのURLを圧縮して格納しようと考える。テキストの圧縮だとzipとか使うとがっつり縮むので、わりとうまくいくかと思ったらそうでもなかった。

import bz2 

import zlib

import gzip

message = b"https://blogger.googleusercontent.com/img/a/AVvXsEiW_tRgG6pcqqu2AxA3j3-m-KY0rvzpmEb_t6zZHK0OBhHVulNav6Rl-So5me4Gh2zf-cvyljvIqi4bpRLi9t3HvlywJ-4xKV90R3S8vzewubIlXJhqJpvK2UucdZ0w4nr90Bq4Wro4122HYI6Uu2_fTELqPT7HBdKOBPRJ1E95iEMbRsthIflMwZdo=s1500"

#適当な URLです

print(f"元テキスト長さ:{len(message)}")

print("\n")


t = zlib.compress(message)

print("zlib 圧縮後: " + str(len(t)) + ", 圧縮率: " + str(round((len(message) - len(t))/len(message)*100)) + "%")

print(t)

print("\n")

t = gzip.compress(message)

print("gzip 圧縮後: " + str(len(t)) + ", 圧縮率: " + str(round((len(message) - len(t))/len(message)*100)) + "%")

#print(t)

print("\n")


#t = bz2.compress(message)

#print("bz2 圧縮後: " + str(len(t)) + ", 圧縮率: " + str(round((len(message) - len(t))/len(message)*100)) + "%")



を実行すると 

元テキスト長さ:242
zlib 圧縮後: 220, 圧縮率: 9%
gzip 圧縮後: 232, 圧縮率: 4%
bz2 圧縮後: 275, 圧縮率: -14%

zlibでも1割か、思っていたより小さくならないな。どうしたものか。 

元テキスト長さ:2652
zlib 圧縮後: 242, 圧縮率: 91%
gzip 圧縮後: 254, 圧縮率: 90%
bz2 圧縮後: 450, 圧縮率: 83%

10倍ぐらいの長さだと、圧縮率かなりあがるね。(URLの繰り返しだけど)

URLを重ねて文字数を稼いでいくとどういう変化するか計算してみたが、URL1回だと圧縮方式によるがzlibで90%、gzip、bz2に至っては114%なので、もとより大きくなる。


2回繰り返すと、圧縮率が大きくなり(繰り返しているからなのだが)、繰り替え指数を多くして文字列を長くすると、圧縮率が大きくなり、15%程度に向かって収束していきそうだ。

bz2が一般に圧縮率高いといわれているけど、今回のようなテキストだと、逆にファイルサイズ大きくなってしまうのね。






コメント

このブログの人気の投稿

Windows10デフォルトゲートウェアに0.0.0.0が追加される

iOS VLC でSMB共有できなかった点について

無線LANルータの選択肢が、NEC Aterm 静的ルーティングできない問題