【问题标题】:Load a large json file 3.7GB into dataframe and convert to csv file using ijson将 3.7GB 的大型 json 文件加载到数据帧中,并使用 ijson 转换为 csv 文件
【发布时间】:2021-02-06 16:33:36
【问题描述】:

我有一个 3.7gb 的大型 json 数据文件。我要将json文件加载到数据框并删除未使用的列,而不是将其转换为csv并加载到sql。 内存是 40GB 我的json文件结构

{"a":"Ho Chi Minh City, Vietnam","gender":"female","t":"841675194476","id":"100012998502085","n":"Lee Mến"}
{"t":"84945474479","id":"100012998505399","n":"Hoàng Giagia"}
{"t":"841679770421","id":"100012998505466","n":"Thoại Mỹ"}

我尝试加载数据,但由于内存不足而失败

data_phone=[]
with open('data.json', 'r', encoding="UTF-8") as f:
    numbers = ijson.items(f, 't',multiple_values=True)
    for num in numbers :
        data_phone.append(num)

显示错误

Out of memory

我尝试另一种方式

导入 json fb_data={} 我=1

with open('output.csv', 'w') as csv_file:
    with open("Vietnam_Facebook_Scrape.json", encoding="UTF-8") as json_file:
        for line in json_file:
            data = json.loads(line)
            try:
                csv_file.write('; '.join([str(i),"/",data["t"],data["fbid"]]))
            except:
                pass

然后我从csv转换为sql,它仍然显示错误“MemoryError:”

con = db.connect("fbproject.db")
cur = con.cursor()
with open('output.csv', 'r',encoding="UTF-8") as csv_file:
    for item in csv_file:
        cur.execute('insert into fbdata values (?)', (item,))
con.commit()
con.close()

感谢阅读

【问题讨论】:

  • ijson 正是为了这个目的而存在的,但是如果您向我们展示您的 json 数据的格式,它会更容易为您提供帮助
  • 为什么需要创建列表和数据框?
  • @joao 我只是更新了我的数据结构。我可以用 500mb 的 json 文件处理同样的问题,但大文件是 3.7gb,它显示错误
  • @juanpa.arrivillaga 我的最终目的是将数据加载到 django。 Step1 读取 json 文件,Step 2 加载到 dataframe,Step 3 将文件保存为 csv,Step 4 加载 csv 到 sql,Step 5 加载数据到 django 进行搜索
  • @DinhTruongAnhPhuong 没有回答我的问题。为什么它需要是数据框或列表?您正在尝试最终编写一个 csv 文件。只需在迭代 json 时创建 csv 文件。

标签: python django database sqlite ijson


【解决方案1】:

您的建议是:

  • 第一步读取json文件
  • 第 2 步加载到数据帧
  • 步骤 3 将文件保存为 csv
  • 第 4 步加载 csv 到 sql
  • 第五步加载数据到django进行搜索

您的第二个示例的问题是您仍然使用全局列表(data_phonedata_name),它们会随着时间的推移而增长。

对于大文件,您应该尝试以下方法:

  • 第一步读取json
    • 一行一行
    • 不要将任何数据保存到全局列表中
    • 将数据直接写入 SQL
  • 第 2 步向您的数据库添加索引
  • 第 3 步使用 django 中的 SQL

您无需向 CSV 写入任何内容。如果你真的想,你可以简单地逐行编写文件:

import json
with open('output.csv', 'w') as csv_file:
    with open("Vietnam_Facebook_Scrape.json", encoding="UTF-8") as json_file:
        for line in json_file:
            data = json.loads(line)
            csv_file.write(';'.join([data['id'], data['t']]))

这是一个可能对您有帮助的问题 (Python and SQLite: insert into table),以便逐行写入数据库。

如果您想改用 CSV,请确保用于将 CSV 转换为 SQL 的程序不会读取整个文件,而是逐行或批量解析它。

【讨论】:

  • 你能告诉我更多关于将数据直接写入 csv 的信息吗?我尝试搜索,但找不到任何结果。我尝试搜索将 ijson 解析转换为 csv。对不起我的知识
  • @DinhTruongAnhPhuong:无需道歉。你在问有趣的问题。我更新了我的答案。
  • 我更新了我的代码。请查看它,更新我的代码作为您的答案后,我从 csv 转换为 sqlite 但它仍然显示内存错误。请帮助我@Eric Duminil
  • @DinhTruongAnhPhuong 您的最后一个示例实际上看起来不错。你知道在你的脚本崩溃之前 db 文件有多大吗?如果没有其他方法,您可能想尝试使用 postgres 或 mariadb。
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2013-09-16
  • 1970-01-01
  • 2017-01-29
  • 1970-01-01
相关资源
最近更新 更多