簡體   English   中英

快速在Python中解碼大量“類似於JSON”的數據

[英]Decode big amount of “JSON-like” data in Python quickly

假設有許多(約300,000個)JSON文件需要很長時間(約30分鍾)才能加載到Python對象列表中。 分析顯示,實際上這不是文件訪問,而是解碼,這花費了大部分時間。 有沒有可以將這些文件轉換為的格式,可以將其更快地加載到python對象列表中?

我的嘗試:我將文件轉換為ProtoBuf(又名Google的Proto col Buf fers),但是即使我得到的文件非常小(減小到原始大小的20%),加載文件的時間也沒有明顯改善(更多超過20分鍾即可全部加載)。

您可能正在尋找轉換的錯誤方向,因為它可能不會像您希望的那樣減少您的加載時間。 如果解碼花費很多時間,那么假設JSON解碼器的寫法不是很不錯,那么其他格式也可能需要花費相當長的時間。 我假設標准庫函數具有不錯的實現,並且JSON對於數據存儲速度而言不是一種糟糕的格式。

您可以嘗試使用PyPy而不是我假設您正在使用的默認CPython實現來運行程序。 PyPy可以大大減少執行時間。 它具有更快的JSON模塊並使用JIT,這可能會大大加快程序速度。

如果您使用的是Python 3,則還可以嘗試使用ProcessPoolExecutor來同時運行文件加載和數據反序列化/解碼。 您將不得不嘗試並發度,但是一個不錯的起點是CPU內核數,您可以將其減半或加倍。 如果程序等待大量I / O,則應運行較高的並發度;如果I / O的度較小,則可以嘗試減少並發度。 如果編寫每個執行器,以便它們將數據加載到Python對象中並簡單地將它們返回,則應該能夠大大減少加載時間。 請注意,您必須使用流程驅動的方法,使用線程將不適用於GIL

您還可以使用更快的JSON庫 ,在最佳情況下可以將執行時間提高兩倍或三倍。 在實際的用例中,加速可能會更小。 請注意,這些可能不適用於PyPy,因為它使用替代CFFI實現,並且不適用於CPython程序,而且PyPy仍然具有良好的JSON模塊。

試試ujson ,它要快很多。

“解碼花費大部分時間”可以看作是“構建Python對象總是花費時間”。 您是否真的一直需要所有這些東西作為RAM對象中的Python對象? 一定很多。

我會考慮使用適當的數據庫,例如查詢這種大小的數據。

如果您需要其他類型的大量處理,例如統計或矩陣處理,那么我來看看pandas

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM