2011-09-12 7 views
0

XML 파일에서 많은 양의 데이터를 가져 와서 (50 만 개가 넘는) 서로에 대해 유효성을 검사해야합니다. 위치 데이터이므로 카운티, 거리 접두어, 거리 접미사, 거리 이름, 시작 집 번호, 끝 번호 등의 정보가 있습니다. 중복, 집 번호 중복 등이 있으며이 모든 데이터 (예 : 문제가있는 곳)에 대해보고해야합니다. 또한 xml 파일 내에 데이터 순서가 없으므로 각 레코드를 다른 모든 레코드와 비교해야합니다.Python에서 데이터를 살균하는 대규모 임시 데이터베이스

지금 나는 거리 이름 정보를 기반으로 한 위치 사전을 작성한 다음 집 번호 시작 및 끝 위치 목록을 저장하고 있습니다. 이 모든 작업이 끝나면 각 목록에서 중복 및 중복을 찾기 위해 만들어진 방대한 데이터 구조를 반복합니다. 나는 데이터 구조의 크기와 얼마나 많은 오류가 발생하는지에 문제가있다.

나에게 제안 된 한 가지 해결책은 파일에서 읽은 모든 데이터를 보관할 임시 SQLite DB를 만든 다음 DB를 실행하여 데이터와 관련된 모든 문제를 찾아서보고 한 다음 파기하는 것입니다 DB. 이 작업을 더 효율적으로 할 수있는 방법이 있습니까? 그리고이 문제에 접근하는 더 좋은 방법에 대한 제안?

fyi로서 내가 읽는 xml 파일은 500MB가 넘습니다 (이 거리 정보 이외의 다른 데이터를 저장합니다.하지만이 파일의 대부분은 파일 임). 파일 처리는 내가 아닌 곳입니다. 문제가 발생하면 파일에서 얻은 데이터 만 처리합니다.

EDIT : 나는 좀 더 자세하게 들어갈 수 있었지만, 데이터를위한 충분한 공간이 있다고 언급 한 포스터는 실제로 정확했다. 한 가지 경우에 나는 이것을 350 만 개의 레코드에 대해 실행해야했지만, 인스턴스 임시 데이터베이스를 만들어야했습니다.

+0

파이썬 표준 라이브러리 bsddb 패키지 사용을 고려하십시오. 사전 인터페이스를 제공하지만 디스크의 해시 테이블 또는 b- 트리가 지원됩니다. –

+0

2.6 이후로 더 이상 사용되지 않음 http://docs.python.org/library/bsddb.html –

+0

OK, http://www.jcea.es/programacion/pybsddb.htm과 bsddb3 모듈을 사용하십시오 ... 같은 생각 , 약간 다른 이름. –

답변

0

500,000은 큰 숫자가 아닙니다. 왜 모든 레코드를 통해 관련 항목에서 사전을 만들고 확인해야하는지 확인하십시오.

import random 
import time 

class Data(object): 
    ID = 0 
    def __init__(self, data): 
     Data.ID+=1 
     self.id =Data.ID 
     self.data = data 
     self.duplicates = None 

def fill_data(N): 
    data_list = [] 
    # create alist of random data 
    sample = list("anuraguniyal") 
    for i in range(N): 
     random.shuffle(sample) 
     data_list.append(Data("".join(sample))) 
    return data_list 

def find_duplicate(data_list): 
    data_map = {} 
    for data in data_list: 
     if data.data in data_map: 
      data_map[data.data].append(data) 
     else: 
      data_map[data.data] = [data] 

     data.duplicates = data_map[data.data] 

st = time.time() 
data_list = fill_data(500000) 
print "fill_data time:", time.time()-st 
st = time.time() 
find_duplicate(data_list) 
print "find_duplicate time:", time.time()-st 

total_duplicates = 0 
max_duplicates = 0 
for data in data_list: 
    total_duplicates += (len(data.duplicates) - 1) 
    max_duplicates = max(len(data.duplicates),max_duplicates) 
print "total_duplicates count:",total_duplicates 
print "max_duplicates count:",max_duplicates 

출력 :

fill_data time: 7.83853507042 
find_duplicate time: 2.55058097839 
total_duplicates count: 12348 
max_duplicates count: 3 

따라서이 경우의 시나리오, 그것은 비슷한 방법으로 어떻게 다른 일을 할 수 있습니까?

+0

아마 그보다 더 힘들 것입니다. 나는 그가 '중복 가능성이있는'것들을 제거하고 정확한 일치 해시 검색을 할 수 없다고 생각한다. –

+0

@rrenaud, 예 수 있습니다하지만 1) 모든 DB 등 그것을 단순화하지 않거나 그것을 최대 속도 2) 전처리 데이터 및 표준 만들기에 의해 해결 될 가능성이 있다고 생각합니다 –

0

이 데이터가 PAF (UK 우체국 주소 파일 - 기본적으로 영국의 모든 주소)에 대해 위생 처리되지 않은 경우 동일한 실제 집이지만 그 철자가 다른 주소, 잘못된 우편 번호, 우편 번호 틀린 분야 등등. 이것은 당신의 접근 방식을 완전히 바꿀 것입니다.

시작하기 전에 위생 처리되었는지 확인하십시오. 당신에게 그것을주는 사람은 "당연히 가지고 있고 나는 그것을했다"고 말할 것입니다. 그렇지 않으면 그들은 공허하게 보일 것입니다.

위생 처리 된 경우 외부 대행사가 귀하의 데이터를 제공하며 아마도이 작업을 수행 할 수 있습니다.하지만 저렴하기 때문에 oyu에게 문의해야합니다. 힘내. 그렇지 않으면

, 당신은 문제의 범위를 가지고 그들이 생각이 숫자로 마련하는 것입니다 일반적으로

경기 등이 될하는 방법을 confidnet, 원하는 일에 대해 상사와 이야기 할 필요가 필드 당 일치 알고리즘 수는 비교중인 두 주소가 동일한 신뢰 값을 출력합니다.그런 다음 특정 수의 값에 가중치가 적용되고 두 주소가 일치하는 것으로 간주하기 위해 총 confidnece 값을 전달해야합니다.

그러나 이것이 분명하지는 않지만 명확하게 귀하의 보스를 확인하는 것이 좋습니다 원하는 - 이것은 마케팅 및 기술 depats 사이에 명확하게 이해 영역이 아닙니다.

+0

OP는 나라에 있다고 가정 우편 시스템이 "PAF"를 제공하는 경우 합리적인 첫 번째 단계는 최저 집 번호를 사용하여 각 레코드를 위생 처리하는 것입니다. 그것은 꽤 괜찮습니다. 거리 - 기타 구성 요소, 인식 할 수없는/수정할 수없는, 거리 등등의 변경 사항은 OK입니다. 번호는 좋지 않습니다. 그런 다음 결과에 따라 가장 높은 집 번호를 반복하십시오. 끔찍한 생각 : 아마 작은 임무를 위해 * PAF를 구성하는 작업 일 것입니다! 또 다른 문제는 공공 서비스와 응급 서비스의 경우 "배달"주소가 반드시 우편 주소가 아닌 것입니다. –