2009-06-19 3 views
0

개체 목록과 해당 속성 (CSV 파일이지만 중요하지 않음)을 제공하는 데이터 소스가 있습니다. 프로그램이 실행될 때마다 개체 목록의 새 복사본을 가져 와서 데이터베이스에 저장된 개체 및 속성 목록과 비교하고 필요에 따라 데이터베이스를 업데이트해야합니다.목록에서 목록을 업데이트하기위한 알고리즘

새로운 개체를 다루는 것은 쉽습니다. 데이터 소스는 각 개체에 순차적 ID 번호를 제공하고 데이터베이스에 대한 새 정보의 맨 위 ID 번호를 확인하면 완료됩니다. 개체의 속성 중 일부가 변경되거나 개체가 삭제되었을 때 다른 경우에 대한 제안을 찾고 있습니다.

순진한 해결책은 데이터베이스에서 모든 개체를 가져 와서 두 세트 (이전 및 신규)의 교차점을 보완 한 다음 그 결과를 검사하는 것이지만 매우 효율적이지는 않습니다. 세트가 커지면. 어떤 아이디어?

+2

각 개체에 대해 해시를 계산하고 저장 하시겠습니까? – FogleBird

답변

1

엄청난 양의 데이터 더미에 대한 표준 접근 방식이 이에 해당합니다.

여기서 list_1은 "마스터"(중복 없음)이고 list_2는 중복 된 "업데이트"라고 가정합니다.

iter_1 = iter(sorted(list_1)) # Essentially SELECT...ORDER BY 
iter_2 = iter(sorted(list_2)) 
eof_1 = False 
eof_2 = False 
try: 
    item_1 = iter_1.next() 
except StopIteration: 
    eof_1= True 
try: 
    item_2 = iter_2.next() 
except StopIteration: 
    eof_2= True 
while not eof_1 and not eof_2: 
    if item_1 == item_2: 
     # do your update to create the new master list. 
     try: 
      item_2 = iter_2.next() 
     except StopIteration: 
      eof_2= True 
    elif item_1 < item_2: 
     try: 
      item_1 = iter_1.next() 
     except StopIteration: 
      eof_1= True 
    elif item_2 < item_1: 
     # Do your insert to create the new master list. 
     try: 
      item_2 = iter_2.next() 
     except StopIteration: 
      eof_2= True 
assert eof_1 or eof_2 
if eof_1: 
    # item_2 and the rest of list_2 are inserts. 
elif eof_2: 
    pass 
else: 
    raise Error("What!?!?") 

예, 잠재적 인 정렬이 포함됩니다. list_1을 파일 시스템에 다시 쓸 때 정렬 된 순서로 보관하면 상당한 시간을 절약 할 수 있습니다. list_2가 정렬 된 구조에 누적 될 수 있으면 상당한 시간을 절약 할 수 있습니다.

미안하지만, 어떤 반복자가 StopIteration을 발생 시켰는지 알아야하기 때문에, 큰 낡은 블록에서 루프 전체를 감싸고있을 수는 없습니다.

1

"마지막 수정 시간"필드를 유지할 방법이 없습니까? 그게 당신이 정말로 찾고있는 것처럼 들리 네. 마지막 시간 백업을 기반으로하는 증분 백업이 마지막으로 객체가 변경/삭제 (/ 추가) 된 것과 비교 된 것입니다.

+0

또는 수정 된 필드가 너무 좋을 것입니다! –

+0

하지만, 나는 슬프게도 CSV 데이터 소스를 변경할 수있는 능력이 없습니다 ... – Dan

0

목록을 프로그램으로 가져 오면 ObjectName과 같은 목록에서 개체의 동일한 속성에 매핑되는 데이터베이스 테이블의 열 속성을 기반으로하는 쿼리를 반복하여 목록을 반복합니다. 또는 전체 테이블을 목록에로드하고 목록을 이와 같이 비교할 수 있습니다. 데이터베이스에 할당 된 ID 외에도 존재하는 개체에 대해 고유 한 것을 가지고 있다고 가정합니다.

해당 개체를 쿼리를 통해 테이블에서 찾을 수없는 경우 새 항목을 만듭니다. 언급 한 FogleBird와 같은 경우 계산 된 해시 또는 CRC를 테이블의 해당 개체에 저장하여 목록의 개체와 비교할 수 있습니다 (개체에 대한 계산 실행). 해시가 일치하지 않으면 해당 개체를 목록의 개체로 업데이트하십시오.

1

데이터베이스와 CSV 파일 모두에 타임 스탬프가 있어야합니다. 타임 스탬프는 레코드가 업데이트되었을 때 데이터를 표시해야하며 업데이트해야하는지 여부를 결정하기 위해 동일한 ID가있는 레코드의 타임 스탬프를 비교해야합니다.

교차로에 대한 아이디어는 ... 그 반대의 경우도 마찬가지입니다. ! CSV에서 모든 데이터를 임시 테이블로 가져오고 두 SQL 데이터베이스 테이블 간의 교차를 수행해야합니다. Oracle 또는 MS SQL 2008 (2005 년은 확실하지 않음)을 사용하면 매우 유용한 MERGE 키워드를 찾을 수 있으므로 적은 노력으로 SQL을 작성한 다음 다른 프로그래밍 언어로 데이터를 병합하는 데 소요됩니다.

관련 문제