{"action":"created","issue":{"url":"https://api.github.com/repos/Yuego/django-fias/issues/44","labels_url":"https://api.github.com/repos/Yuego/django-fias/issues/44/labels{/name}","comments_url":"https://api.github.com/repos/Yuego/django-fias/issues/44/comments","events_url":"https://api.github.com/repos/Yuego/django-fias/issues/44/events","html_url":"https://github.com/Yuego/django-fias/issues/44","id":117980695,"number":44,"title":"Импорт из dbf файлов","user":{"login":"jungornti","id":10721388,"avatar_url":"https://avatars.githubusercontent.com/u/10721388?v=3","gravatar_id":"","url":"https://api.github.com/users/jungornti","html_url":"https://github.com/jungornti","followers_url":"https://api.github.com/users/jungornti/followers","following_url":"https://api.github.com/users/jungornti/following{/other_user}","gists_url":"https://api.github.com/users/jungornti/gists{/gist_id}","starred_url":"https://api.github.com/users/jungornti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jungornti/subscriptions","organizations_url":"https://api.github.com/users/jungornti/orgs","repos_url":"https://api.github.com/users/jungornti/repos","events_url":"https://api.github.com/users/jungornti/events{/privacy}","received_events_url":"https://api.github.com/users/jungornti/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":14,"created_at":"2015-11-20T07:20:08Z","updated_at":"2015-11-30T08:54:47Z","closed_at":null,"body":"ФИАС предоставляет дельты и сами базы в формате xml и dbf.\r\n\r\nДля python есть утилита dbfread. Она позволяет последовательно, без полной загрузки файла в память считывать данные, автоматически приводить их к нужному типу (даты), работает быстрее и ест меньше памяти.\r\n\r\nРаботает это всё дело намного быстрее парсинга xml и прочих операций соответственно.\r\n\r\nНасколько я понимаю ваш код, переписать его для поддержки dbf вместо xml будет не очень сложно, там действительно очень мало различий - в паре мест убрать валидацию по тегу (row.tag == 'Object', например) и конверсию дат вручную - и вместо dict(row.attrib())  просто возвращать row в bulk index.\r\n\r\nУ меня есть прототип основанный на частях вашего кода, на моём не очень быстром ПК импорт 1200000 записей из таблицы AddrObj происходит в течение 30-40 минут. Код прототипа пока что выложить не могу к сожалению, т.к. он очень сырой."},"comment":{"url":"https://api.github.com/repos/Yuego/django-fias/issues/comments/160559901","html_url":"https://github.com/Yuego/django-fias/issues/44#issuecomment-160559901","issue_url":"https://api.github.com/repos/Yuego/django-fias/issues/44","id":160559901,"user":{"login":"Yuego","id":951586,"avatar_url":"https://avatars.githubusercontent.com/u/951586?v=3","gravatar_id":"","url":"https://api.github.com/users/Yuego","html_url":"https://github.com/Yuego","followers_url":"https://api.github.com/users/Yuego/followers","following_url":"https://api.github.com/users/Yuego/following{/other_user}","gists_url":"https://api.github.com/users/Yuego/gists{/gist_id}","starred_url":"https://api.github.com/users/Yuego/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yuego/subscriptions","organizations_url":"https://api.github.com/users/Yuego/orgs","repos_url":"https://api.github.com/users/Yuego/repos","events_url":"https://api.github.com/users/Yuego/events{/privacy}","received_events_url":"https://api.github.com/users/Yuego/received_events","type":"User","site_admin":false},"created_at":"2015-11-30T08:54:47Z","updated_at":"2015-11-30T08:54:47Z","body":"> Мне кажется, что это ошибки целостности в БД и такие записи (дублирующиеся) необходимо игнорировать.\r\n\r\nВесь вопрос в том, как их игнорировать. Записи добавляются в базу пачками по ~10000 (настраиваемо). Можно попробовать перехватывать исключение, как-то выдергивать из текста ошибки id записи и перебором исключать её из пачки, затем повторно пытаться загрузить в БД.\r\nНо это довольно сильно снизит скорость импорта.\r\n\r\nДля MySQL есть INSERT  IGNORE и REPLACE. Для PG есть INSERT ON CONFLICT DO NOTHING (но это только с версии 9.5). У меня уже была мысль написать свой менеджер, который будет выполнять специфичные для БД запросы. Это бы сильно упростило жизнь и не пришлось бы городить костыли. Но универсального метода не существует - в актуальных версиях Postgres нет поддержки нужных функций. Но, можно создать хранимую процедуру... В общем, простого пути нет - нужно над этим подумать как следует.\r\n\r\n> К тому же, на мой взгляд, ФИАС используется для импорта двух основных таблиц - socrbase и addrobj, т.е. normdoc, house, houseint и тд можно исключить из импорта по-умолчанию, вообще.\r\n\r\nСогласен. Следует поменять поведение по-умолчанию."}}