将 3.7GB 的大型 json 文件加载到数据框中,并使用 ijson 转换为 csv 文件
Load a large json file 3.7GB into dataframe and convert to csv file using ijson
我有一个很大的 json 数据文件,有 3.7gb。我要将 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()
感谢阅读
您的建议是:
- 第 1 步读取 json 文件
- 第 2 步加载到数据帧
- 第 3 步将文件另存为 csv
- 第 4 步将 csv 加载到 sql
- 第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 and SQLite: insert into table),以便逐行写入数据库。
如果您想改用 CSV,请确保用于将 CSV 转换为 SQL 的程序不会读取整个文件,而是逐行或批量解析它。
我有一个很大的 json 数据文件,有 3.7gb。我要将 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()
感谢阅读
您的建议是:
- 第 1 步读取 json 文件
- 第 2 步加载到数据帧
- 第 3 步将文件另存为 csv
- 第 4 步将 csv 加载到 sql
- 第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 and SQLite: insert into table),以便逐行写入数据库。
如果您想改用 CSV,请确保用于将 CSV 转换为 SQL 的程序不会读取整个文件,而是逐行或批量解析它。