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和运行时效率。我尝试以大块方式处理文件,但是我仍然没有找到正确的方法,因为在我当前的解决方案中,整个数据集仍然需要使用年龄。
非常感谢您的帮助!
查看您的代码,您正在创建太多临时列表(这可能是一个问题)。
您可以尝试使用此代码来加快处理速度:
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"}}