Адресный реестр ГАР БД ФИАС на ноутбуке геомаркетолога и разработчика: почему умер КЛАДР и как разобрать 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 — ОКАТО и ОКТМО)!