동일한 키가 큰 사전 가입 :내가 지금처럼 파이썬 사전을 포함 약 10 대용량 파일이
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])}
}
기본적으로 그들은 사전의 모든 사전이 있습니다. 각 파일의 크기는 약 1GB입니다 (위는 데이터의 예입니다). 어쨌든, 내가 뭘하고 싶은 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])
I가 있음을하려고하면 내 1GB 파일 메모리의 최종 사전은 물론 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])}
내가 생물학 너무 많은 프로그래밍 경험이없는 (당신은 위의 데이터는 생물 정보학 문제를 나타냅니다 짐작 할 수있다) 그래서 어떤 도움 많이 감사하겠습니다!
당신이하지 않은 이유가 있나요 데이터베이스 시스템을 사용하고 있습니까? 이런 식으로 조작해야 할 엄청난 양의 데이터가있는 것 같습니다. –
대부분의 이유로 모든 종류의 데이터베이스에 대한 나의 경험이 부족합니다. 파이썬 사전을 db로 변환 할 때 나는 무엇을 제안합니까? – deckardk
'eval'을 사용한다는 사실은 게으른 해결책을 얻는 것을 어렵게 만듭니다. @Voo가 말하듯이 데이터베이스를 사용하십시오. – nneonneo