Память хранилища объектов Python / Dict / DB / Другие параметры - PullRequest
0 голосов
/ 26 октября 2010

В настоящее время я пишу приложение на python, которое возьмет каталог текстовых файлов и проанализирует их в пользовательских объектах python на основе атрибутов, указанных в текстовом файле.Как часть моего приложения, я сравниваю текущий загруженный набор данных объекта с предыдущим набором данных (в том же формате) и сканирую его на предмет возможных дубликатов, конфликтов, обновлений и т. Д. Однако, поскольку одновременно может быть ~ 10 000+ объектов, яЯ не совсем уверен, как подойти к этому.

В настоящее время я храню предыдущий набор данных в БД, так как он используется другим веб-приложением.На данный момент мое приложение на Python загружает «предложенный» набор данных в память (создавая объекты правил), а затем я сохраняю эти объекты в словаре (проблема № 1).Затем, когда приходит время сравнивать, я использую комбинацию запросов SQL и неудачных вставок для определения новых / существующих и существующих, но обновленных записей (проблема № 2).

Это в лучшем случае хакерское и ужасное.Я ищу несколько советов по реструктуризации приложения и обработке хранения / сравнения объектов.

1 Ответ

1 голос
/ 26 октября 2010

Вы можете подделать то, что делает Git, и загрузить весь набор в виде одного файла и проанализировать оттуда. Самая большая проблема в том, что словари не упорядочены, поэтому ваши сравнения не всегда будут 1: 1. Список кортежей даст вам сравнение 1: 1. Если многое изменилось, это будет сложно.

Вот основной процесс, как вы можете это сделать.

  • Начните с обоих списков кортежей с индексом 0.
  • Сравните хэш каждого кортежа hashlib.sha1(str(tuple1)) == hashlib.sha1(str(tuple2))
  • Если они равны, запишите соответствующие индексы и добавьте 1 к каждому индексу и сравните снова
  • Если они неравны, найдите на каждой стороне совпадение и запишите соответствующие индексы
  • Если совпадений нет, вы можете предположить, что происходит вставка / обновление / удаление, и вернуться к нему позже

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

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

Опять же, может быть проще использовать библиотеку diff для сравнения двух наборов данных. С таким же успехом нельзя изобретать велосипед; даже если это может быть действительно блестящее колесо.

Выезд http://docs.python.org/library/difflib.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...