在大資料處理領域,效率與資源利用始終是工程師們面臨的核心挑戰。近期,我們團隊發現一個內部使用的資料格式轉換工具在處理 GB 級別的 JSON 輸入檔案時,出現了嚴重的記憶體佔用問題,頻繁觸發 OOM(Out Of Memory)錯誤。這類大型 JSON 檔案並非 JSONL 格式,而是整個檔案作為單個超大物件或超大陣列存在,給傳統解析方式帶來了巨大挑戰。

JSONL 格式與傳統 JSON 的區別

JSONL(JSON Lines)格式已經成為一種常見的解決方案。JSONL 將每條 JSON 資料單獨放在一行,每行之間相互獨立,這使得處理大型資料集時可以逐行讀取和處理,無需將整個檔案載入到記憶體中。然而,現實世界中的資料並不總是以這種理想格式存在。我們面臨的恰恰是那些非 JSONL 格式的超大 JSON 檔案,它們作為單一的、不可分割的資料結構存在,傳統的解析方法在處理時必須將整個結構載入到記憶體中,這正是導致 OOM 問題的根本原因。

解決方案

面對這一技術難題,我們採取了輕量級但高效的解決方案。透過僅僅 200 多行程式碼,我們從零實現了一個全新的流式 JSON 解析器。

雖然市場上已有成熟的流式 JSON 解析工具,如 YAJL 等,但自主開發給我們帶來了更大的靈活性和針對性最佳化空間。這種“從零開始”的方法看似簡單,卻能精準解決我們的特定問題。

最關鍵的技術突破在於,新實現的解析器將空間複雜度降至接近 O(1),這意味著無論輸入的 JSON 檔案多大,記憶體佔用都保持在一個相對恆定的水平。這對於處理超大規模資料而言,是一個質的飛躍。

技術驗證

為確保解析器的穩定性和正確性,我們設計了嚴格的自動化測試流程。測試中,我們刻意使用了極小的記憶體快取衝區(分別為單位元組、雙位元組和三位元組),對各種規模的真實 JSON 輸入進行了極限測試。

測試結果令人滿意:所有情況下,解析器都能正確處理輸入資料,且反向轉換出的 JSON 與原始 JSON 完全一致。這證明了我們的實現不僅節省記憶體,還保持了資料完整性。

持續最佳化

雖然當前實現已經解決了記憶體佔用問題,但指令碼實現在 CPU 效率方面仍有提升空間。為此,我們已委託加拿大團隊的工程師將現有實現轉換為 C++ 版本,以進一步提升處理速度。

未來,如果在效能方面出現新的瓶頸,我們可以依託 OpenResty XRay 動態追蹤平臺進行深入分析。這一平臺能夠精確定位系統中的效能熱點,為持續最佳化提供資料支援。

技術啟示

這次最佳化實踐再次證明,有時候簡單而精巧的解決方案比複雜的架構更有效。200 多行程式碼解決了 GB 級資料處理的記憶體瓶頸,體現了 OpenResty 一貫倡導的工程哲學:簡潔高效,精準解決問題。

除了 OpenResty XRay,OpenResty Inc. 還提供了全面的私有庫服務,覆蓋各行各業的技術需求。這些私有庫在效能最佳化、安全防護和資料處理方面都具有顯著優勢,能夠幫助企業快速構建高效能、高可靠性的應用系統。無論是金融、電商還是傳媒行業,OpenResty Inc. 的私有庫都能提供量身定製的解決方案,滿足不同場景下的特定需求。

我們的技術團隊將繼續致力於開發和完善 XRay 工具套件及私有庫服務,幫助開發者和企業發現並解決各類效能瓶頸。我們相信,透過精確的效能分析和針對性最佳化,許多看似無法改進的效能問題都能得到突破性解決。

關於 OpenResty XRay

OpenResty XRay 是一個動態追蹤產品,它可以自動分析執行中的應用,以解決效能問題、行為問題和安全漏洞,並提供可行的建議。在底層實現上,OpenResty XRay 由我們的 Y 語言驅動,可以在不同環境下支援多種不同的執行時,如 Stap+、eBPF+、GDB 和 ODB。

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴,是 “邊緣計算 “、” 動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用 動態追蹤 技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的 部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了 英文版 原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!