在JSON数据集中合并重复项,以尽可能提高CPU,RAM和运行时的效率

问题描述 投票:1回答:1

Goal:尽可能以CPU,RAM和运行时有效的方式合并JSON数据集中的重复项。

Dataset:数据集由〜250,000个由换行符分隔的JSON对象组成。每个对象都有一个作为其标题的键,以及一个嵌套在其值对象中的国家,城市和类别。类别是一个自己的对象,具有类别名称和排名值(这是所分配类别正确的置信度)。

任务:查找在标题,国家和城市方面匹配的对象(可以超过2个),然后通过选择排名最高的类别并将其丢弃,将它们合并到单个数据集中。尝试在运行时和RAM需求之间找到一个良好的平衡。

示例:

{“Place A”: {“category”: {“A”: 21},”country”: “USA”, “city”: “New York”}}

+

{“Place A”: {“category”: {“B”: 95},”country”: “USA”, “city”: “New York”}}

=

{“Place A”: {“category”: {“B”: 95},”country”: “USA”, “city”: “New York”}}

我当前的解决方案:

import json
import os
import psutil
from collections import OrderedDict
from functools import partial

CHUNK_SIZE = 1024*1024

seen = OrderedDict()
with open('test.json', 'r') as input_file, open('merged_dataset.json', 'w') as output_file:
    while True:
        data = input_file.readlines(CHUNK_SIZE)
        if not data:
            break

        for line in read_data:
            temp = json.loads(line)
            title = next(iter(temp))

            if title not in list(seen.keys()):
                seen[title] = temp
            elif title in list(seen.keys()): 
                if seen[title][title]['country'] == temp[title]['country'] and seen[title][title]['country'] == temp[title]['country']: 
                    if list(temp[title]['category'].values())[0] > list(seen[title][title]['category'].values())[0]:
                        seen[title] = temp 
    output_file.writelines(json.dumps(v) + '\n' for v in seen.values())    

问题:

  • 当我在数据集中使用约1000个json对象进行测试时,合并算法似乎可以正常工作。您对我还有什么建议或想法吗?

  • 我仍然必须使我的方法具有更高的RAM,CPU和运行时效率。我尝试以大块方式处理文件,但是我仍然没有找到正确的方法,因为在我当前的解决方案中,整个数据集仍然需要使用年龄。

  • 您有什么建议或建议,我可以进行哪些更改以提高其RAM,CPU和运行时效率?

非常感谢您的帮助!

python json merge runtime memory-efficient
1个回答
0
投票

查看您的代码,您正在创建太多临时列表(这可能是一个问题)。

您可以尝试使用此代码来加快处理速度:

import json

seen = {}

with open('input.txt', 'r') as f_in:
    for line in f_in:
        d = json.loads(line)
        title, vals = d.popitem()
        cat_key, cat_val = vals['category'].popitem()

        _, old_val = seen.get((title, vals['country'], vals['city']), (None, float('-inf')))
        if old_val < cat_val:
            seen[(title, vals['country'], vals['city'])] = (cat_key, cat_val)

with open('output.txt', 'w') as f_out:
    for (title, country, city), (cat_key, cat_val) in seen.items():
        d = {title:{cat_key:cat_val}, 'country': country, 'city': city}
        print(json.dumps(d), file=f_out)

[C0的内容:

input.txt

运行脚本后输出文件的内容:

{"Place B": {"category": {"C": 102},"country": "USA", "city": "New York"}}
{"Place A": {"category": {"A": 21},"country": "USA", "city": "New York"}}
{"Place A": {"category": {"B": 95},"country": "USA", "city": "New York"}}
{"Place B": {"category": {"B": 95},"country": "USA", "city": "New York"}}
{"Place B": {"category": {"A": 21},"country": "USA", "city": "New York"}}
© www.soinside.com 2019 - 2024. All rights reserved.