1

我有一个 3.7gb 的大型 json 数据文件。我要将json文件加载到数据框并删除未使用的列,而不是将其转换为csv并加载到sql。ram 是 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={} i=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()

谢谢阅读

4

1 回答 1

3

你的提议是:

  • 步骤 1 读取 json 文件
  • 步骤 2 加载到数据框
  • 步骤 3 将文件另存为 csv
  • 步骤 4 将 csv 加载到 sql
  • Step 5 加载数据到django进行搜索

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

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

  • 第1步读取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 和 SQLite: insert into table),以便逐行写入数据库。

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

于 2021-02-06T17:38:55.503 回答