2011-09-12 59 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!另一个问题是,对于公用事业和紧急服务,“交付”地址不一定是邮政地址。 –