5
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.

Pythonでjson.dumpsのsepatatorsオプションを使ってファイルサイズを軽量化する

Last updated at Posted at 2023-01-04

はじめに

Pythonのjson.loads()で、ある.jsonを読み込み、読み込んだ直後のオブジェクトに対してjson.dumps()を実行すると、実行後にファイルサイズが増加する現象に直面しました。

調査したところ、原因がjson.dumps()を実行するときのsepatatorsオプションにあり、デフォルト値だとファイルサイズが増加してしまうケースがあることが分かったため、対応方法を備忘録として残します。

separatorsオプション

separatorsオプションはJSONのKey-Valueおよび要素間の区切り文字を指定するものですが、デフォルトだと(',', ': ')が指定され、コロンの後ろに半角スペースが挿入されます。

separators はもし指定するなら (item_separator, key_separator) というタプルでなければなりません。デフォルトは indent が None のとき (', ', ': ') で、そうでなければ (',', ': ') です。最もコンパクトな JSON の表現を得たければ空白を削った (',', ':') を指定すればいいでしょう。

バージョン 3.4 で変更: indent が None でなければ (',', ': ') がデフォルトで使われます。

https://docs.python.org/ja/3/library/json.html#basic-usage

この仕様より、元々の.jsonで既に半角スペースが除かれているケースにおいては、出力時にjson.dumps()をデフォルトオプションで実行することでファイルサイズが増加してしまうことになります。

separatorsオプションから空白を取り除く

上記で解説されているように、空白を削った(',', ':')を明示的に指定することでファイルサイズを削減できます。

json.dumps(obj, separators=(',', ':'))

検証結果

条件(要素数など)によって変わりますが、手元のテストファイルで試した時には、separatorsオプションがデフォルト値の時のファイルサイズが71.4KBに対し、separatorsオプションを明示的に指定した時のファイルサイズが69.5KBとなり、1.9KB削減できました。

まとめ

1ファイルでは大したことありませんが、ETLなどの処理を実行する場合、数十万から数百万というファイル数になると、大きな差となって現れますので、このようなテクニックは頭の片隅に置いておくと良さそうです。

関連記事

5
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
5
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?