我有大约 10 个包含 python 字典的大文件,如下所示:
dict1:
{
'PRO-HIS-MET': {
'A': ([1,2,3],[4,5,6],[7,8,9]),
'B': ([5,2],[6],[8,9]),
'C': ([3],[4],[7,8])},
'TRP-MET-GLN': {
'F': ([-5,-4,1123],[-7,-11,2],[-636,-405])}
}
dict2:
{
'PRO-HIS-MET': {
'J': ([-657], [7,-20,3], [-8,-85,15])}
'TRP-MET-GLN':{
'K': ([1,2,3],[4,50,6],[7,80,9]),
'L': ([5,20],[60,80],[8,9])}
}
基本上它们都是字典的字典。每个文件大小约为 1 GB(以上只是数据示例)。无论如何,我想做的就是将这 10 部字典加入到一起:
final:
{
'PRO-HIS-MET': {
'A': ([1,2,3],[4,5,6],[7,8,9]),
'B': ([5,2],[6],[8,9]),
'C': ([3],[4],[7,8])
'J': ([-657], [7,-20,3], [-8,-85,15])},
'TRP-MET-GLN': {
'F': ([-5,-4,1123],[-7,-11,2],[-636,-405])
'K': ([1,2,3],[4,50,6],[7,80,9]),
'L': ([5,20],[60,80],[8,9])}
}
我在小文件上尝试了以下代码,它工作正常:
import csv
import collections
d1 = {}
d2 = {}
final = collections.defaultdict(dict)
for key, val in csv.reader(open('filehere.txt')):
d1[key] = eval(val)
for key, val in csv.reader(open('filehere2.txt')):
d2[key] = eval(val)
for key in d1:
final[key].update(d1[key])
for key in d2:
final[key].update(d2[key])
out = csv.writer(open('out.txt', 'w'))
for k, v in final.items():
out.writerow([k, v])
但是,如果我在我的 1 GB 文件上尝试这样做,我会通过将 d1 和 d2 以及最终字典保存在内存中来快速耗尽内存。
我有几个想法:
- 有没有一种方法可以让我从分段字典中加载键,比较它们,如果在多个字典中找到相同的键,只需组合值?
与其将字典合并到一个巨大的文件中(这将来可能会让我记忆犹新),如何在合并数据后创建多个包含一个键的所有值的单独文件?例如,对于上述数据,我将只有:
pro-his-met.txt: 'PRO-HIS-MET': { 'A': ([1,2,3],[4,5,6],[7,8,9]), 'B': ([5,2],[6],[8,9]), 'C': ([3],[4],[7,8]) 'J': ([-657], [7,-20,3], [-8,-85,15])} trp-met-gln.txt: 'TRP-MET-GLN': { 'F': ([-5,-4,1123],[-7,-11,2],[-636,-405]) 'K': ([1,2,3],[4,50,6],[7,80,9]), 'L': ([5,20],[60,80],[8,9])}
作为生物学家,我没有太多的编程经验(您可能已经猜到上述数据代表了生物信息学问题),因此非常感谢任何帮助!