Skip to content

[Python] 使用 ujson 套件提昇 Json 檔處理速度

無論是何種程式語言,在進行資料處理的時候,常常都會選擇 Json 這樣的資料格式。

Json 是種輕量級的資料交換語言,而且可讀性佳,相當適合用來存放資料。不過在 Python 當中,有時候我們會遇到讀取 Json 檔案的速度瓶頸,這通常發生在檔案過大的時候。

今天想要紀錄的,便是如何使用 “ujson” 這個第三方 Python 套件。 “ujson” 全稱為 UltraJSON,是一個使用純 C 語言開發的快速 Json 編碼器 (Encoder)、解碼器 (Decoder),適用於 Python 2.5+ 以及 Python 3+。

“ujson” 這個套件最大的好處,就在於其速度比 Python 原生的速度快上不少。我們可以看看 PyPI 上的統計資料 (網址於此:https://pypi.org/project/ujson/)

可以看到 “ujson” 的速度普遍都比原生的 json 套件來得快。不過數字終歸是數字,使用套件,一定要自己實戰測試過才行。


使用 ujson 讀取 json 檔案

以下只進行簡單的 Json 檔案讀取測試,畢竟我希望能夠加速的部份往往都是 Decoder 讀取進來的部份。寫入 Json 的部份往往只是需要進行資料的『前處理』,所以多半不會寫入太多次;反而是讀取進來的部份,我往往會重複利用同一份 Json 格式的資料好幾次,所以能夠節省 Json 讀取時間,那當然是再好不過。

如果是第一次使用,需要使用以下指令安裝:

sudo pip3 install ujson

安裝好之後,我先展示下我要打開的 Json 文件:

du --block-size=1G train_data.json

Output:

10 train_data.json

大概有 10 G 左右的 Json 檔案。

然後我們使用原生的 json 套件打開檔案:

import time
import json
start=time.time()
with open('train_data.json', 'r') as f:
    text = json.load(f)

print(time.time()-start, 's')



Output:

191.61602115631104 s

然後接下來,我使用 “ujson” 測試看看開啟速度:

import time
import ujson
start=time.time()
with open('train_data.json', 'r') as f:
    text = ujson.load(f)

print(time.time()-start, 's')


Output:

110.23203444480896 s

“ujson” 的使用方法跟原生的 json 幾乎沒有區別。也可以看到,開啟的速度真的提昇了。


心得

(2020/03/29 更新) 距離我開始將工作環境的 Json 檔案全面換成使用 “ujson” 之後,多少還是發生了幾次小問題。其中最明顯的就是,雖然 “ujson” 寫入速度、讀取速度確實比原生的 json 快上不少,但是其記憶體的耗用是更加龐大的,我有幾次就是因為 OOM (Out Of Memory) 的情況導致程式報錯。

建議記憶體足夠再來追求速度。


References


Read More

Leave a Reply