用Python快速解析一个12 GB的JSON文件

用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

我有一个12GB的JSON文件,每一行都包含关于一篇科学论文的信息。这就是它的样子

我想解析它并创建3个数据帧,其中包含有关场馆、作者以及作者在场馆中发表过多少次的信息。下面你可以看到我写的代码。我的问题是,这段代码需要很多天才能运行。有没有办法让它更快

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"]