【问题标题】:How to load a large JSON file to a Pandas Dataframe如何将大型 JSON 文件加载到 Pandas 数据框
【发布时间】:2020-07-21 00:23:33
【问题描述】:

我有 16 个 JSON 文件,每个文件大小约为 14GB。我尝试了以下方法逐行阅读它们。

with open(file_name, encoding="UTF-8") as json_file:
cursor = 0
for line_number, line in enumerate(json_file):
    print ("Processing line", line_number + 1,"at cursor index:", cursor)
    line_as_file = io.StringIO(line)
    # Use a new parser for each line
    json_parser = ijson.parse(line_as_file)
    for prefix, type, value in json_parser:
        #print ("prefix=",prefix, "type=",type, "value=",value,ignore_index=True)
        dfObj = dfObj.append({"prefix":prefix,"type":type,"value":value},ignore_index=True)
    cursor += len(line)

我的目标是将它们加载到 pandas 数据框中以执行一些搜索操作。

问题是这种方法需要花费大量时间来读取文件。

还有其他最佳方法可以实现这一目标吗?

【问题讨论】:

  • 关于加载一个json到pandas,你试过pd.read_json(file_name)吗?
  • 是的。这会立即将整个文件加载到内存中,从而导致内核崩溃。
  • 尺寸可能是一种威慑。可能数据库会更好地为您服务
  • 看看 mongoDB(存储 JSON)和 pymongo。您可以使用字段名称、条件、搜索等从 JSON 中获取所有内容。可能需要使用 Dask 而不是 pandas(非常相似的语法),具体取决于您拥有多少 RAM(pandas df 就像文件大小的 4 倍)。跨度>

标签: python json pandas data-science ijson


【解决方案1】:

您只能将json_file 直接传递给 ijson.parse 一次,而不是从中读取单独的行。如果您的文件有多个顶级 JSON 值,那么您可以使用 multiple_value=True 选项(有关说明,请参阅 here)。

还要确保您使用的是最新的 ijson,并且yajl2_c 后端是正在使用的后端(在 ijson 3 中,您可以通过查看 ijson.backend 来查看选择了哪个后端)。有关后端的信息,请查看here

【讨论】:

  • 是的,我确实在我的代码中使用了“multiple_value=True”。我将检查 ijson 后端。谢谢!
  • 这确实提高了速度,但并不显着。我拥有的数据大小是这里的瓶颈。无论如何,谢谢!
  • 另一个可能降低性能的问题是如何将数据附加到 DataFrame 中。与其将其创建为空并调用append,不如尝试不同的方法:DataFrame 构造函数的data 参数可以采用可迭代(或者说here),因此如果您将示例代码包装为产生( prefix, type, value) 元组,那么您也许可以将该生成器作为 DataFrame 的数据源传递。
【解决方案2】:

您可以使用 Pandas 内置函数
pandas.read_json()
文档是Here

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2017-06-03
    • 1970-01-01
    • 2022-11-07
    • 2018-10-06
    • 1970-01-01
    相关资源
    最近更新 更多