用Python快速解析一个12 GB的JSON文件
我有一个12GB的JSON文件,每一行都包含关于一篇科学论文的信息。这就是它的样子 我想解析它并创建3个数据帧,其中包含有关场馆、作者以及作者在场馆中发表过多少次的信息。下面你可以看到我写的代码。我的问题是,这段代码需要很多天才能运行。有没有办法让它更快用Python快速解析一个12 GB的JSON文件,python,json,python-3.x,Python,Json,Python 3.x,我有一个12GB的JSON文件,每一行都包含关于一篇科学论文的信息。这就是它的样子 我想解析它并创建3个数据帧,其中包含有关场馆、作者以及作者在场馆中发表过多少次的信息。下面你可以看到我写的代码。我的问题是,这段代码需要很多天才能运行。有没有办法让它更快 venues = pd.DataFrame(columns = ['id', 'raw', 'type']) authors = pd.DataFrame(columns = ['id','name']) main = pd.DataFram
venues = pd.DataFrame(columns = ['id', 'raw', 'type'])
authors = pd.DataFrame(columns = ['id','name'])
main = pd.DataFrame(columns = ['author_id','venue_id','number_of_times'])
with open(r'C:\Users\dintz\Documents\test.json',encoding='UTF-8') as infile:
papers = ijson.items(infile, 'item')
for paper in papers:
if 'id' not in paper["venue"]:
if 'type' not in paper["venue"]:
venues = venues.append({'raw': paper["venue"]["raw"]},ignore_index=True)
else:
venues = venues.append({'raw': paper["venue"]["raw"], 'type': paper["venue"]["type"]},ignore_index=True)
else:
venues = venues.append({'id': paper["venue"]["id"] , 'raw': paper["venue"]["raw"], 'type': paper["venue"]["type"]},ignore_index=True)
paper_authors = paper["authors"]
paper_authors_json = json.dumps(paper_authors)
obj = ijson.items(paper_authors_json,'item')
for author in obj:
authors = authors.append({'id': author["id"] , 'name': author["name"]},ignore_index=True)
main = main.append({'author_id': author["id"] , 'venue_raw': venues.iloc[-1]['raw'],'number_of_times': 1},ignore_index=True)
authors = authors.drop_duplicates(subset=None, keep='first', inplace=False)
venues = venues.drop_duplicates(subset=None, keep='first', inplace=False)
main = main.groupby(by=['author_id','venue_raw'], axis=0, as_index = False).sum()
ApacheSpark允许并行读取多个块中的json文件,以加快读取速度- 对于常规的多行JSON文件,请将multiLine参数设置为True 若你们不熟悉Spark,你们可以在Spark的顶部使用熊猫兼容层,这就是考拉- 考拉读json调用-
您使用了错误的工具来完成此任务,请勿在此场景中使用熊猫。 让我们看一下最后3行代码,它简单明了,但是当您无法使用pandas输入函数(如read_json()或read_csv()时,如何将这些数据填充到pandas数据框中并不那么容易 对于这个简单的任务,我更喜欢使用纯python,如果您的PC有足够的内存,请使用dict获得唯一的作者和地点,使用to grouping和use计算计数
authors = {}
venues = {}
for paper in papers:
venues[paper["venue"]["id"]] = (paper["venue"]["raw"], paper["venue"]["type"])
for author in obj:
authors[author["id"]] = author["name"]