2011-09-12 94 views
0

我從XML文件中提取大量數據,所有這些數據都需要相互驗證(超過500,000條記錄)。它是位置數據,因此它具有以下信息:縣,街道前綴,街道後綴,街道名稱,起始門牌號碼,結束號碼。有重複,房號重疊等,我需要報告所有這些數據(如有問題的地方)。另外,xml文件中沒有數據排序,因此每條記錄都需要與其他所有記錄進行匹配。在Python中處理數據的大型臨時數據庫

現在我創建一個基於街道名稱信息的位置字典,然後存儲房屋號碼開始和結束位置的列表。完成這一切之後,我正在遍歷創建的海量數據結構,以便在每個列表中查找重複項和重疊項。我遇到了數據結構的大小問題以及出現了多少錯誤。

向我提出的一個解決方案是創建一個臨時SQLite數據庫,以保存從文件中讀取的所有數據,然後運行數據庫以查找數據的所有問題,並將其報告出來,然後銷燬DB。有沒有更好/更有效的方法來做到這一點?並有更好的方法來解決這個問題的任何建議?

作爲一個fyi,我正在閱讀的xml文件超過了500MB(存儲了除這條街道信息之外的其他數據,儘管這是它的大部分數據),但是文件的處理不在我所在的位置遇到問題時,它只是在處理從文件中獲得的數據時。

編輯:我可以進入更多的細節,但海報誰提到,有足夠的數據內存空間實際上是正確的,雖然在一個情況下,我確實必須運行這對350萬條記錄,在那我確實需要創建一個臨時數據庫。

+0

考慮使用Python標準庫bsddb包。它提供了一個字典界面,但由磁盤上的哈希表或B樹支持。 –

+0

自2.6起已棄用http://docs.python.org/library/bsddb.html –

+0

好的,使用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(英國郵局地址文件 - 英國的每個地址基本上)的消毒,那麼您將在那裏有相同的實際房屋地址,但拼寫有所不同,錯誤的郵政編碼,郵編錯誤的領域等等。這將徹底改變你的方法。

看看在開始之前是否對此進行了消毒。提供給你的人要麼說:「當然是,我做到了」,否則他們會顯得茫然 - 在這種情況下沒有。

如果它已經過消毒,很好,可能是一家外部代理商提供您的數據,他們可能會爲您做這件事,但我希望oyu被問到,因爲它更便宜。進行。

如果沒有,你有一系列的問題,需要與你的老闆談談他們想要什麼,他們想怎麼confidnet成爲比賽等

一般的想法是拿出數匹配算法每個字段,輸出一個置信度值,兩個地址比較是相同的。然後一定數量的這些值加權,並且必須通過總體安全值來考慮匹配的兩個地址

但我不清楚這是你的問題,但我建議你檢查你的老闆究竟是什麼想要 - 這不是市場營銷和技術發展之間清楚明瞭的領域。

+0

假設OP在一個國家在郵政系統提供「PAF」的情況下,合理的第一步將是使用最低門牌號清理每條記錄;它可以很好,可以改變街道等組件,無法識別/不可修復,街道等等,但是數量不好。然後可能會根據結果重複最高門牌號碼。 Horrid認爲:或許任務是爲一些小區域構建一個PAF!另一個問題是,對於公用事業和緊急服務,「交付」地址不一定是郵政地址。 –