Last Updated on 2021-06-02 by Clay
無論是何種程式語言,在進行資料處理的時候,常常都會選擇 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) 的情況導致程式報錯。
建議記憶體足夠再來追求速度。