在Python中组合多个词典

在Python中组合多个词典,python,json,mongodb,dictionary,Python,Json,Mongodb,Dictionary,我有一个12 GB的文件,其中每一行都是JSON对象,格式如下: { "name": "abc", "val1":500, "val2":30, "val3":{ "topic1":{ "val4":["abc","xyz"], "val5":["asdf"] }

我有一个12 GB的文件,其中每一行都是JSON对象,格式如下:

{
    "name": "abc", 
    "val1":500,
    "val2":30, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        }
           }
}
{
    "name": "abc", 
    "val1":800,
    "val2":40, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        },
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}
不幸的是,这是对象结构,无法更改

假设此文件中有另一行:

{
    "name": "abc", 
    "val1":300,
    "val2":10, 
    "val3":{
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}
我现在需要合并具有相同名称的对象,以便获得以下形式的对象:

{
    "name": "abc", 
    "val1":500,
    "val2":30, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        }
           }
}
{
    "name": "abc", 
    "val1":800,
    "val2":40, 
    "val3":{
               "topic1":{
                            "val4":["abc","xyz"],
                            "val5":["asdf"]
                        },
               "topic2":{
                            "val4":["hello","world"],
                            "val5":["test"]
                        }
           }
}
我正在逐行读取文件,并在Python中加载每行的JSON对象。所以每一行基本上都变成了Python
dict()
。然后,我将该对象存储在MongoDB集合中,如果文件中出现另一个同名的对象,我将更新Mongo记录,以便将其合并,如上面的示例所示

我尝试采用与中相同的方法,但我使用Mongodb来适应某些值的对象结构。然而,即使对于一个400 MB的示例文件,这也是非常慢的


有没有更好的方法,可以使用某种并行处理?

这段代码应该会有所帮助

# not tested
import json

mydict = {}
with open(myfile,'r') as infile:
    for line in infile:
        myline = json.loads(line)
        if myline['name'] in mydict:
            mydict[myline['name']]['val1'] += myline['val1']
            mydict[myline['name']]['val2'] += myline['val2']
            mydict[myline['name']]['val3'] += [myline['val3']]
        else:
            mydict[myline['name']] = myline
            mydict[myline['name']]['val3'] = [myline['val3']]
然而,你的问题确实模棱两可,所以这是我对你试图实现的目标的看法


编辑:我只是连接字典,但是您可以在发生
.append(myline)
的部分中实现更复杂的合并逻辑

不太清楚你在问什么。数据是否已导入MongoDB集合?在这两种情况下,您的意思是{“name”:“abc”,“val3”:{“topic1”:{“val4”:[“efg”,“abc”]}}}}`将与上述内容组合在一个“val4”数组中成为
[“abc”,“xyz”,efg”]
?还是什么?无论如何,
mapReduce
可能不是一个“好”选项,因为所有输出“必须”基本上是“{
”。\u id:“某物”,”值“:“somethingElse”}
因为
\u id
值作为结构都是必须的,无论它们包含什么。所以如果你的目标是一个新的集合,这不是最好的选择。但是如果你可以接受,那么好吧。不,数据存在于一个文件中。我正在尝试使用MongoDB组合行。组合应该是{“name”:“abc”val3:{“topic1”:{“val4”:[“abc”,“xyz”],“val5”:[“asdf”]},“topic2”:{“val4”:[“efg”,“abc”]}}}。具有相同“name”字段的两个对象在“val3”中不会都有“topic1”(或任何相同的键)。为了澄清,我正在尝试将多个具有相同“name”的对象组合在一起“将字段转换为单个对象。要做到这一点,我需要在数值处添加值,并在嵌套对象处合并值。抱歉,但确实像mud一样清晰,而且您还应该清楚您是否“有意”最终将信息存储在MongoDB中。如果不是,你只是想用一个“工具”,那就有点像用链锯切三明治。将对象“合并”的示例包含在“问题”的主体中,而不是在注释中,这样会更加清晰。谢谢您的回答。不幸的是,我没有很好地表达我的问题,这不是我想要的。我已经编辑了我的问题,使它更容易理解,我希望你能提供帮助!我做了一些编辑,使它更接近你需要的。我的意思不是给你一段可以粘贴到应用程序中的代码。更重要的是给你一个可以搭建的脚手架。希望有帮助。我最初尝试过这种方法,但文件是12GB,字典(在示例代码中是mydict)内存不足。我正在尝试处理这个问题,但现在只处理文件的较小子集