2012年4月2日

筆記:減少 JSON 資料體積

將 Database 查詢的 Result Set 完整回傳到 Client/Browser 端,通常會使用 JSON 及 XML 兩種格式,若是用於網頁的 AJAX,比較好的作法是 JSON,體積稍微小一些,接收端的解析速度也快。

若以 API 形式設計資料存取服務,則可以使用路徑來區別回傳格式,例如:

/service/readData.xml
/service/readData.json

利用 MVC 框架提供的 Route 自訂功能,可以讓 Server 端程式自動依照網址指定的格式處理回傳資料。

由於 JSON 是文字型態的資料,且大量資料容易有重複的情況,將產生的資料經過  GZIP 或 DEFLATE 壓縮處理,可以節省不少傳輸時間及頻寬。

Apache 伺服器可以搭配 mod_deflate 模組。
Nginx 可以搭配 HttpGzipModule 模組。

若不透過伺服器,利用 Web App 本身的 GZIP 模組也可以達到壓縮效果。

PHP 可使用 ob_gzhandler
Node.js 可以搭配 zlibgzippo(靜態檔案),關於 zlib 可參考我提供的範本

當然,JSON本身的資料格式也有機會壓縮,例如:

[{a: 1, b: 2, c: 3},{a: 2, b: 3, c: 4}]

這個 JSON 範例資料,可以看到在每一筆 row 都重複了 a, b, c 的 field 名稱。HPack 及 CJSON 兩個演算法的目的,就是要壓縮這種形態的資料。

使用 HPack 與 CJSON 演算法來壓縮 JSON

其中 HPack 已經更名為 JSONH(Homogeneous Collection Compressor)。

JSONH 的壓縮效果相當好,搭配 GZIP/DEFLATE 可以達到相當不錯的壓縮率。

JSONH 在 Server 端提供 Ruby / Python / PHP 函式庫,將資料經演算壓縮後,丟給 Browser 端,再使用 JavaScript 的函式庫還原成原始的資料。照理說 JSONH 的 JavaScript 有機會給 CommonJS/Node.js 使用,也就是同時用於 Server/Browser 兩端(這個假設尚未驗證)。

在 ExtJS 的 Data Reader 中,有  XML、Array 及 JSON 三種,先不管 XML,其中 Array 及 JSON 其實都是同樣的 JSON 結構,只是 Array 並不包含 field 名稱(也就是說 JSON Reader 是 Array 裡面裝 Object,而 Array Reader 則是 Array 裡面裝 Array)。

Ext.data.reader.Array
Ext.data.reader.Json

以這兩種 Reader 來說,大部分情況都建議用 JSON Reader,因為回傳的資料可以透過 field 名稱索引出對應的資料,但 Array Reader 就必須依賴陣列中元素的先後次序來映射資料。

但是遇到資料量非常大、卻又需要一次全部讀取到 Client 端(保存到 ExtJS 的 Data Store 中),就可以考慮用 Array Reader,兩者的資料體積可能相差非常多。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!