繁体   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