【问题标题】:Making a large json file quickly available in python在 python 中快速生成一个大的 json 文件
【发布时间】:2020-09-24 12:02:24
【问题描述】:

我有一个大约 5 GB 的多 json 文件,我对它进行了一些探索性数据分析。问题是每次我加载文件时,使用这段代码大约需要 1 分钟的时间来加载它:

with open(json_fn, 'r') as f:   # multiple jsons in one file! (one per line)
   for line in f:
       data = json.loads(line)

有没有更有效的方法来存储这些数据以便在 python 中加载?我在考虑泡菜(因为它是一种通常更快的二进制格式)但是it seems to be even slower。有什么建议可以用来避免每次等待 1 分钟吗?

【问题讨论】:

  • pickle 的目的是保存和恢复任意 Python 对象,而不是高效地存储文本数据。
  • 如果行具有相同(或基本相同)的结构,是否可以将它们存储在适当的数据库中?如果你可以腌制,你当然可以推送到 MySQL、sqlite 或其他任何东西。
  • 如果你的数据不需要引用并且你被普通文件困住,那么即使是 csv 也会有意义(解析更简单):-D

标签: python json storage pickle


【解决方案1】:

您可以为此目的使用ijson。 ijson 允许以流的形式懒惰地读取文件。

import ijson

json_data = ijson.parse(open(FILE_PATH, 'r'))

for prefix, event, value in json_data:
    print(value)

请参考this

注意:借助post 中提到的后端,您可以大大提高性能。

【讨论】:

  • 这几乎是 OP 已经在做的事情;它只是将文件读取和单行解析组合在同一个迭代器中。
  • @chepner 不,他使用内置的 json 库。我建议使用 ijson
  • 是的,该迭代器的作用与 OP 的代码相同:它从文件中读取一行并将其解析为 JSON。
  • 但它比读取和 json.loading 一次要快吗?我在文档中没有看到任何关于加速的内容
  • 我认为ijson的主要好处是懒惰地解析一个单个值,而不是单个文件中的一系列值。
猜你喜欢
  • 1970-01-01
  • 2019-03-13
  • 2011-05-26
  • 1970-01-01
  • 2015-03-20
  • 2012-04-17
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多