Эффективный импорт данных?

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

Во-первых, наша система работает (грубо говоря): мы запускаем процесс Coldfusion один раз в день, который извлекает данные, предоставленные поставщиком IDX через FTP. Они передают данные нам. Что нам пришлют, то и получим.

С годами это оказалось довольно нестабильным.

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

Когда дело доходит до «обновления» существующих данных, моей первоначальной мыслью было запрашивать только те данные, которые были обновлены. Существует поле «Изменено», в котором сообщается, когда листинг обновлялся в последний раз, и код, который у меня есть, будет захватывать любой листинг, обновленный в течение последних 6 часов (дайте себе окно на случай, если что-то пойдет не так).

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

Это лучший способ сделать это? Или я могу просто получить данные, которые мне нужны? Мне не имеет большого смысла делать больше обработки, чем необходимо. Мысли?


person Kevin    schedule 09.04.2010    source источник


Ответы (2)


Если вы можете доверять ИЗМЕНЕНИЮ, ваш подход достаточно хорош и быстрее, чем разбор всего файла. Если вы зацикливаете всю находку, пытаясь найти, что изменено, а что нет, это будет сложнее.

Небольшое улучшение производительности произойдет, если вы сможете отправить файл непосредственно в базу данных и позволить ему импортировать его с помощью встроенных функций импорта файлов. Например, MySQL имеет это - http://dev.mysql.com/doc/refman/5.0/en/mysqlimport.html Я уверен, что другие БД, такие как SQL Server и Oracle, тоже имеют такие механизмы. Это сэкономит вам накладные расходы на работу с языком программирования и будет использовать только ресурсы базы данных.

person Ivo Sabev    schedule 09.04.2010
comment
Извините, под «запросом» я имел в виду использование DMQL в своем запросе. Например, Query()->SELECT->(Modified|PhotoModified), который затем переводится с другой стороны как «дайте мне любой список, в котором дата изменения или изменения фотографии ______», где _____ — сегодня — 6 часов. Так что эта часть обработки находится на их стороне, но я понимаю, что вы имеете в виду. - person Kevin; 09.04.2010

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

И что бы вы ни делали, не обрабатывайте построчно, это самый неэффективный способ делать что-то. Я могу выполнить пакетную вставку миллиона записей быстрее, чем я могу обработать набор данных из 100 000 записей по одной строке за раз. Но есть основанные на наборе способы сделать тип, если вставить, о котором вы говорите, и основанное на наборе обновление 100 измененных записей будет быстрее, чем пакетная вставка 50 000 записей.

person HLGEM    schedule 09.04.2010
comment
Поле, кажется, обновлено, поэтому я полагаюсь на это в данный момент. Что означает построчный процесс? Неудобная сторона RETS заключается в том, что я должен явно указать тип свойства в запросе. Итак, чтобы составить список номеров MLS, мне нужно зациклить каждый тип недвижимости (около 6) и вытащить их вниз. После этого я запускаю только несколько сотен списков каждый cron, которые получают полную информацию. - person Kevin; 09.04.2010
comment
Это означает, что вы обрабатываете только одну строку за раз, что является неэффективной практикой. Если вы используете цикл или курсор, возможно, вы выполняете построчную обработку. В этом случае пакетный процесс для усечения всех записей и вставки их в массовую вставку может быть быстрее, но вам придется протестировать это на своей системе. - person HLGEM; 09.04.2010