Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → Государственный адресный реестр ГАР (бывший ФИАС) на ноутбуке аналитика: потоковый разбор XML ФНС в DuckDB и PostgreSQL

Адресный реестр ГАР БД ФИАС на ноутбуке геомаркетолога и разработчика: почему умер КЛАДР и как разобрать 40 ГБ XML за минуты

Практическое руководство по локальной загрузке Государственного адресного реестра (ГАР ФНС России, fias.nalog.ru) на рабочий ноутбук: разница муниципального и административного деления, потоковый парсер iterparse для AS_ADDR_OBJ / AS_HOUSES и еженедельные дельты.

Адресный реестр ГАР БД ФИАС на ноутбуке геомаркетолога и разработчика: почему умер КЛАДР и как разобрать 40 ГБ XML за минуты

Каждую неделю аналитики девелоперов, управляющих компаний ЖКХ, розничных сетей и банков сталкиваются с одной и той же задачей: нужно нормализовать 250 000 «грязных» адресов объектов недвижимости, проставить им эталонный 36-символьный FIAS GUID (OBJECTGUID), связать с кадастровыми номерами в выгрузках Росреестра и подготовить пакеты без единого отказа форматно-логического контроля госшлюзов!

И здесь многие натыкаются на две ошибки: во-первых, пытаются искать древний КЛАДР 4.0 или старый формат ФИАС DBF (чьё обновление ФНС России официально прекратила ещё 31 августа 2021 года!), а во-вторых — скачивают с портала fias.nalog.ru актуальный архив gar_xml.zip, распаковывают его на 90+ гигабайт XML-файлов и вешают свой ноутбук намертво попыткой открыть гигантский AS_HOUSES_*.XML обычным парсером в оперативной памяти (MemoryError)!

Архитектура ГАР (Приказ ФНС № ЕД-7-6/329@): две иерархии в одной базе!

Ключевое отличие современного Государственного адресного реестра (ГАР) от старого ФИАС, которое обязан понимать каждый специалист по данным недвижимости и электронным XML-схемам Росреестра: один и тот же жилой дом одновременно входит сразу в ДВЕ параллельные адресные иерархии:

Иерархия в XML-таблицах ГАР Ключевой файл связи в папке региона (01..99) Где применяется на практике
Административно-территориальное деление (АТД) AS_ADM_HIERARCHY_*.XML (Область -> Район -> Город -> Улица -> Дом) Привычное бытовое и почтовое написание адреса для курьеров, договоров аренды и витрин классифайдов
Муниципальное деление (МД) AS_MUN_HIERARCHY_*.XML (Субъект РФ -> Городской/муниципальный округ -> Внутригородская территория -> Улица -> Дом) Обязательный стандарт для муниципальных услуг, налогового учёта ФНС (ОКТМО), ГИС ЖКХ и градостроительных регламентов!

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

  • OBJECTID (BIGINT, целое число) — быстрый внутренний числовой ключ связи между таблицами AS_ADDR_OBJ (регионы, города, улицы), AS_HOUSES (здания/сооружения), AS_APARTMENTS (помещения/квартиры), AS_STEADS (земельные участки), AS_PARAM (индекс, кадастровый номер, ОКАТО, ОКТМО!) и таблицами иерархии!
  • OBJECTGUID (UUID, 36 символов вида a8b3...) — вечный внешний юридический идентификатор Код ФИАС / ГАР, который пишется во все государственные XML-схемы, договоры, платёжные документы ЖКХ и банковские ипотечные анкеты!

Как разобрать весь gar_xml.zip (или нужные регионы) на ноутбуке на 4 ГБ ОЗУ без зависаний

Главный секрет: никогда не распаковывайте весь 90-гигабайтный архив на диск целиком и никогда не вызывайте ET.parse()! Потоковое чтение прямо из ZIP-потока в Python (zipfile + xml.etree.ElementTree.iterparse) с очисткой каждого прочитанного узла elem.clear() держит потребление оперативной памяти ноутбука на уровне всего 80 мегабайт при любом размере файла и конвертирует регион в сверхбыстрый .parquet для DuckDB или локальной базы PostgreSQL / PostGIS за считанные секунды:

import zipfile
import xml.etree.ElementTree as ET

def stream_active_gar_houses(gar_zip_path: str, region_code: str = "77"):
    """Потоковое чтение актуальных домов региона из gar_xml.zip с расходом RAM < 80 МБ."""
    with zipfile.ZipFile(gar_zip_path) as zf:
        target = next(n for n in zf.namelist() if n.startswith(f"{region_code}/AS_HOUSES_") and "PARAMS" not in n)
        with zf.open(target) as stream:
            for _, elem in ET.iterparse(stream, events=("end",)):
                if elem.tag == "HOUSE":
                    # Берём ТОЛЬКО действующие актуальные записи (ISACTIVE="1" и ISACTUAL="1")!
                    if elem.attrib.get("ISACTIVE") == "1" and elem.attrib.get("ISACTUAL") == "1":
                        yield (
                            int(elem.attrib["OBJECTID"]),
                            elem.attrib["OBJECTGUID"],
                            elem.attrib.get("HOUSENUM", ""),
                            elem.attrib.get("ADDNUM1", ""),
                        )
                    elem.clear()  # Мгновенное освобождение памяти на ноутбуке!

Обратите особое внимание на фильтр ISACTIVE="1" AND ISACTUAL="1": в ГАР хранится вся историческая цепочка переименований каждой улицы и перенумерации каждого дома — если забыть этот фильтр, JOIN размножит один дом в пять дублирующихся строк! А после первичной загрузки на ноутбук скачивайте по пятницам с fias.nalog.ru крошечный еженедельный дельта-архив gar_delta_xml.zip (20–80 МБ), который обновляет всю базу РФ за 15 секунд!

Требования к ноутбуку под локальный справочник ГАР РФ + кадастр

Если вам нужны только 2–3 своих региона присутствия (например, Москва + МО или СПб + ЛО), вся база в формате Parquet / SQLite занимает на ноутбуке меньше 1,5 ГБ. Если же вы геомаркетолог федеральной сети и держите полную адресную базу всех 89 субъектов РФ со всеми квартирами, земельными участками и кадастровыми номерами из AS_PARAM:

  • Быстрый NVMe SSD от 512–1000 ГБ (под сжатые колоночные таблицы .parquet всех субъектов уйдёт всего 8–12 ГБ вместо 120 ГБ сырого XML!) и 16–32 ГБ ОЗУ — как недорого добавить второй NVMe-накопитель под локальные аналитические витрины, подробно показано в статье апгрейд оперативной памяти и SSD в ноутбуке.

Чек-лист аналитика при работе с данными ГАР ФНС

  • [ ] В запросах к таблицам объектов, домов, помещений и обеих иерархий (ADM / MUN) жестко стоит условие актуальности ISACTIVE = 1 AND ISACTUAL = 1.
  • [ ] Чётко зафиксировано, какой именно GUID требует целевая система: GUID здания (AS_HOUSES.OBJECTGUID) или GUID конкретного жилого/нежилого помещения (AS_APARTMENTS / AS_ROOMS.OBJECTGUID)! (Путаница дома и квартиры — причина № 1 отказов при выгрузке в ГИС ЖКХ и банки!)
  • [ ] Настроено регулярное накатывание еженедельных дельт ФНС (gar_delta_xml.zip) по CHANGEID / ID для подхвата только что введённых корпусов новостроек.

Частые вопросы

Где внутри gar_xml.zip лежит кадастровый номер дома или квартиры — в AS_HOUSES такого столбца нет?! Совершенно верно: все дополнительные характеристики объектов в ГАР вынесены в отдельные EAV-файлы параметров AS_HOUSES_PARAMS_*.XML, AS_APARTMENTS_PARAMS_*.XML и AS_STEADS_PARAMS_*.XML, где тип параметра задаётся числовым TYPEID из корневого справочника AS_PARAM_TYPES_*.XML (TYPEID = 8 — кадастровый номер объекта недвижимости, TYPEID = 5 — почтовый индекс, TYPEID = 6/7 — ОКАТО и ОКТМО)!