用于清理Python中数据的大型临时数据库

时间:2011-09-12 16:40:28

标签: python xml sanitization

我从xml文件中提取了大量数据,所有这些数据都需要相互验证(超过500,000条记录)。它是位置数据,因此它具有以下信息:县,街道前缀,街道后缀,街道名称,起始门牌号,结束号码。有重复,门牌号重叠等,我需要报告所有这些数据(例如哪里有问题)。此外,xml文件中没有数据排序,因此每条记录都需要与所有其他记录进行匹配。

现在我正在根据街道名称信息创建位置字典,然后存储门牌号码的起始位置和结束位置列表。完成所有这些后,我将遍历创建的海量数据结构,以查找每个列表中的重复和重叠。我遇到了数据结构大小和出现的错误数量问题。

向我建议的一个解决方案是创建一个临时的SQLite数据库来保存从文件中读取的所有数据,然后运行数据库以查找数据的所有问题,报告它们,然后销毁D B。有没有更好/更有效的方法来做到这一点?关于更好地解决这个问题的任何建议?

作为一个fyi,我正在读取的xml文件超过500MB(存储除了这条街道信息之外的其他数据,虽然这是其中的大部分),但是文件的处理不是我正在运行的地方问题,只有在处理从文件中获得的数据时才会出现。

编辑:我可以详细介绍一下,但是海报上提到内存中有足够的空间用于数据实际上是正确的,尽管在一个案例中我确实必须针对350万条记录运行,在这种情况下我确实需要创建一个临时数据库。

2 个答案:

答案 0 :(得分: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

那么你的情景与这种情况有多么不同,可以用类似的方式完成吗?

答案 1 :(得分:0)

除非这些数据已经针对PAF(英国邮局地址文件 - 英国的每个地址基本上)进行了清理,否则您将在那里拥有相同的实际房屋地址,但拼写不同,邮政编码错误,邮政编码错误这将彻底改变你的方法。

在开始之前检查是否已经过消毒。赠送给你的人会说“当然是,我做了”或者说看起来很茫然 - 在这种情况下没有。

如果它被消毒了,很好,可能是外部机构提供你的数据,他们可能会为你做这个,但我希望oyu被问到因为它更便宜。上车。

如果没有,你会遇到一系列问题,需要与老板讨论他们想要什么,他们想要的比赛信息等等。

一般来说,这个想法是每个字段提出一些匹配算法,输出一个置信度值,比较两个地址是相同的。然后加权一定数量的这些值,并且必须传递总的confidnece值以将两个地址视为匹配

但我不清楚这是你的问题,但我建议你检查你的老板究竟想要什么 - 这不是营销和技术部门之间明确理解的区域。