簡體   English   中英

Python 中非常大的 JSON 處理

[英]very large JSON handling in Python

我有一個非常大的 JSON 文件(~30GB,65e6 行),我想使用一些數據幀結構來處理它。 這個數據集當然不適合我的記憶,因此我最終想使用一些內存不足的解決方案,比如 dask 或 vaex。 我知道,為了做到這一點,我首先必須將它轉換成一種已經內存可映射的格式,如 hdf5(如果你對格式有建議,我會很樂意接受它們;數據集包括分類特征等) .

關於數據集的兩個重要事實:

  1. 數據結構為一個列表,然后每個 dict 樣式的 JSON 對象都在一行中。 這意味着我可以通過解析它並刪除方括號和逗號來非常輕松地將它轉換為以行分隔的 JSON,這很好。
  2. JSON 對象嵌套很深,它們之間的鍵存在差異。 這意味着如果我使用 JSON 閱讀器來讀取按順序讀取塊的行分隔 JSON(如 pandas.read_json() with specified lines=True and chunksize=int),則展平 (pd.json_normalize) 后生成的數據幀可能不相同列,這不利於將它們流式傳輸到 hdf5 文件中。

在我花大量時間編寫腳本提取所有可能的鍵並將塊的每一列逐一傳輸到 hdf5 文件並在需要的地方插入 NaN 之前:有沒有人知道更優雅的解決方案問題? 非常感謝您的幫助。

PS 不幸的是,我真的不能分享任何數據,但我希望上面的解釋能夠很好地描述結構。 如果沒有,我會嘗試提供類似的例子。

作為一般規則,您需要的是一個面向流/事件的 JSON 解析器。 參見例如json-stream 這樣的解析器可以使用固定數量的內存處理任何大小的輸入。 解析器不會將整個 JSON 加載到內存中,而是調用您的函數來響應樹中的各個元素。 您可以在回調函數中編寫您的處理。 如果您需要對此數據進行更復雜或重復的處理,那么首先將其存儲在數據庫中可能是有意義的。

暫無
暫無

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

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