sqlite 将一个大的json文件3.7 GB加载到dataframe中,并使用ijson转换为CSV文件

apeeds0o  于 2022-11-15  发布在  SQLite
关注(0)|答案(1)|浏览(195)

我有一个3.7 GB的大型json数据文件。我要将json文件加载到dataframe并删除未使用的列,然后将其转换为CSV并加载到SQL。RAM是40 GB我的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,它仍然显示错误“内存错误:”

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()

感谢您的阅读

k2arahey

k2arahey1#

你的建议是:

  • 步骤1读取json文件
  • 步骤2加载到 Dataframe
  • 步骤3将文件另存为CSV
  • 第四步将CSV加载到SQL
  • 步骤5将数据加载到Django进行搜索

第二个例子的问题是,您仍然使用全局列表(data_phonedata_name),它们会随着时间的推移而增长。
对于大文件,以下是你应该尝试的:

  • 步骤1读取json
  • 逐行
  • 不要将任何数据保存到全局列表中
  • 将数据直接写入SQL
  • 步骤2向您的数据库添加索引
  • 第三步使用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的程序不会读取整个文件,而是逐行或成批地解析它。

相关问题