Большая временная база данных для очистки данных в Python - PullRequest
0 голосов
/ 12 сентября 2011

У меня есть большой объем данных, которые я извлекаю из XML-файла, и все они должны быть проверены друг на друга (более 500 000 записей). Это данные о местоположении, поэтому в нем есть такая информация, как: округ, префикс улицы, суффикс улицы, название улицы, номер начального дома, номер конца. Имеются дубликаты, совпадения номеров домов и т. Д., И мне необходимо сообщить обо всех этих данных (например, о проблемах). Кроме того, нет никакого упорядочения данных в файле XML, поэтому каждая запись должна сопоставляться со всеми остальными.

Прямо сейчас я создаю словарь местоположения на основе информации о названии улицы, а затем сохраняю список номеров домов, начальных и конечных местоположений. После всего этого я перебираю массивную структуру данных, которая была создана, чтобы найти дубликаты и совпадения в каждом списке. У меня проблемы с размером структуры данных и количеством возникающих ошибок.

Одним из решений, которое мне было предложено, было создание временной базы данных SQLite для хранения всех данных при их чтении из файла, а затем через базу данных, чтобы найти все проблемы с данными, сообщить о них, а затем уничтожить DB. Есть ли лучший / более эффективный способ сделать это? И какие-нибудь предложения по лучшему подходу к этой проблеме?

Как к сведению, xml-файл, в котором я читаю, имеет размер более 500 МБ (в нем хранятся другие данные, помимо этой информации об улицах, хотя это большая часть), но обработка файла не там, где я работаю в проблемы, это только при обработке данных, полученных из файла.

РЕДАКТИРОВАТЬ: Я мог бы вдаваться в подробности, но постер, который упомянул, что в памяти достаточно места для данных, был действительно верным, хотя в одном случае мне приходилось проверять 3,5 миллиона записей, в этом случае Мне нужно было создать временную базу данных.

Ответы [ 2 ]

1 голос
/ 12 сентября 2011

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 голосов
/ 12 сентября 2011

Если эти данные уже не были обработаны с помощью PAF (адресный файл почтового отделения в Великобритании - каждый адрес в Великобритании в основном), тогда у вас будут адреса, которые являются тем же самым фактическим домом, но написаны по-разному, неправильный почтовый индекс, неправильный почтовый индекс поле и т. д. Это полностью изменит ваш подход.

Проверьте, очищено ли это, прежде чем начать. Человек, который даёт вам это, либо скажет: «Да, конечно, я сделал это», либо они будут выглядеть тупо - в этом случае нет.

Если он очищен, прекрасно, возможно, внешнее агентство предоставляет ваши данные, и они, вероятно, могут сделать это для вас, но я ожидаю, что вас спрашивают, потому что это дешевле. Получить на.

Если нет, то у вас есть целый ряд проблем, и вам нужно поговорить с вашим боссом о том, чего они хотят, о том, как они хотят быть близкими, и т.д.

В общем, идея состоит в том, чтобы придумать количество алгоритмов сопоставления для каждого поля, которые выдают достоверное значение, что два сравниваемых адреса совпадают. Затем определенное количество этих значений взвешивается, и необходимо передать общее значение доверия, чтобы считать два адреса совпадающими

Но я не уверен, что это ваша проблема, но я предлагаю вам проверить, чего именно хочет ваш начальник - это не совсем понятная область между отделом маркетинга и технической службой.

...