【发布时间】:2017-10-10 04:18:46
【问题描述】:
我遇到了几个讨论 ijson 在 python 中加载巨大 JSON 文件的线程,因为这是不消耗所有内存的方法。
我的文件大小约为 1.4 GB,它有几个节点(见下图),我只对一个保存大部分数据的节点感兴趣(c_driver_location)。
我的目标是:我只想提取 c_driver_location 节点数据并将其插入到 mysql db 表中(它将有四列:id、经度、纬度、时间戳)。
表 ddl:
创建表 drv_locations_backup7May2017 (id bigint unsigned auto_increment 主键, drv_fb_id varchar(50), 纬度 DECIMAL(10, 8) NOT NULL, 经度 DECIMAL(11, 8) NOT NULL, 时间戳整数)
我的问题是:我运行了附加代码的第一部分(直到连接到 mysql 之前),但是它运行了 20 个小时并且仍然没有完成对 json 的解析。 (我在较小的文件上进行了测试,效果很好)。
有没有一种最佳方法可以让这个过程更快、更高效?
import numpy as np
import pandas as pd
from pandas import Series, DataFrame
import ijson
import pymysql.cursors
import pymysql
filename = "D:\json_file.json"
drv_col_list = ['drv_fb_id','latitude','longitude','timestamp']
drv_df = DataFrame(columns = drv_col_list)
drv_df.timestamp = drv_df.timestamp.astype(int)
counter = 0
with open(filename, 'r') as fd:
parser = ijson.parse(fd)
for prefix, event, value in parser:
if prefix == 'c_driver_location' and str(event) == 'map_key':
drv_fb_id = value
counter = counter + 1
elif prefix.endswith('.latitude'):
latitude = value
elif prefix.endswith('.longitude'):
longitude = value
elif prefix.endswith('.timestamp'):
timestamp = value
elif prefix.endswith(drv_fb_id) and str(event) == 'end_map':
drv_df = drv_df.append(pd.DataFrame({'drv_fb_id':drv_fb_id,'latitude':latitude,'longitude':longitude,'timestamp':timestamp},index=[0]),ignore_index=True)
connection = pymysql.connect(host='53.000.00.00',
port = 3306,
user='user',
password='abcdefg',
db ='newdb',
# charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
# write to mysql
drv_df.to_sql(con=connection, name='drv_locations_backup7May2017', if_exists='replace', flavor='mysql')
connection.close()
【问题讨论】:
-
如果您的代码已经在运行并且您只想对其进行优化,您可以将问题发布到codereview.stackexchange.com。
-
如果只是将大量数据加载到mysql数据库中,您应该使用dev.mysql.com/doc/refman/5.7/en/load-data.html
-
@mpf82 谢谢,我已经做到了。
-
@AnthonyKong 在连接到 mysql 之前我已经运行了代码,只是为了解析 json 文件并将结果放入数据框中。但它需要很长时间并且没有完成。
-
不确定为什么需要数据框。只需将最终格式的数据转储到本地文件中即可。然后运行
load data批量上传到数据库表中。
标签: python mysql json python-2.7 ijson