Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / MySQL |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Ну вот потребовалось. Соответственно задача решена, поделюсь решением. Полная БД выгружается налоговой в двух форматах - DBF и XML. Но с DBF работать неудобно, да и таблицы там нарублены на кучу частей. В общем, сразу решено было использовать исходные данные в XML, тем более что MySQL имеет средства загрузки из них напрямую. Первым делом на основе XSD-схем данных были построены скрипты создания таблиц. Заодно выяснилось, что схемы даны не все, а их содержимое не всегда соответствует файлу с описанием формата выгрузки, размещённому на сайте ФИАС. Но задача несложная, работаем по факту.
В качестве движка выбран MyISAM - это ускоряет импорт. Также были отключены (в скриптах - закомментированы) ограничения и первичные индексы - с той же целью. Имея готовые структуры, несложно выполнить импорт данных. Первым делом имена XML-файлов для удобства работы были укорочены. Затем построены запросы импорта данных (исходные файлы были расположены по пути b:\fias).
Импорт всех файлов, кроме самого большого, прошёл быстро и хорошо (большие файлы NORMDOC.XML и ADDROBJ.XML импортировались 2 и 4 минуты соответственно, все остальные практически мгновенно). А вот с самым большим, 16-гигабайтным HOUSE.XML возникла проблема. Сервер импортировал порядка четверти файла, после чего потребление памяти возрастало с исходных 450 Мбайт до 2 Гбайт и процесс обрывался по ошибке недостатка памяти. Было принято решение поделить файл на части и выполнить их импорт. Для нарезки было быстро накидано приложение на VB6, файл поделен на 9 частей по 1,8 Гбайт.
Процесс деления на часты выполнялся прямо из среды VB6Nano и продолжался порядка 20 минут. Затем полученные части были импортированы в базу.
Импорт прошёл без проблем, каждая часть импортировалась чуть больше 3 минут. Итоговый размер базы данных составил около 9 Гбайт. PS. При импорте было выявлено, что 4 записи таблицы NORMDOC.XML содержат некорректные относительно схемы данные (размер данных превышает размер поля). Но это мелочи... |
|||||
15 дек 15, 17:57 [18564177] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Дополнительные сведения по среде выполнения. Весь процесс выполнялся локально на рабочей станции. Процессор Е2160 1,8 ГГц. Физической памяти 2 Гбайт. ОС Windows 7 Max SP1 Rus. Server version: 5.6.14-log MySQL Community Server (GPL). Все кодировки (сервера, БД и пр.) - UTF8. Все операции выполнялись непосредственно из UTF-8 консоли. |
15 дек 15, 18:19 [18564282] Ответить | Цитировать Сообщить модератору |
Artemeey Member Откуда: Сообщений: 59 |
Полезно будет добавить следующее: Актуальную базу ФИАС в XML можно скачать тут: http://fias.nalog.ru/Public/DownloadPage.aspx Обновления, так же можно скачать там. Обновление нужно накладывать на готовую БД. Обновления необходимо проверять раз в сутки, чтобы не потерять актуальность данных. Дату последнго обновления можно получить так: http://fias.nalog.ru/Public/Downloads/Actual/VerDate.txt |
7 янв 16, 04:35 [18648977] Ответить | Цитировать Сообщить модератору |
miksoft Member Откуда: Сообщений: 38694 |
Обновлю ссылку: http://fias.nalog.ru/Updates.aspx |
28 янв 16, 19:33 [18742279] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
Может программу для нарезки больших файлов сделать на DELPHI ?! Мне не удалось скомпилировать на VB... А я в свою очередь сделаю программу которая автоматом будет создавать/удалять структуру и заливать XML в базу! |
10 мар 16, 14:49 [18915857] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Сделай, если не лень... |
||
10 мар 16, 15:27 [18916064] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
Akina, Я не знаю как нарезать XML... а остальное сделал К сообщению приложен файл. Размер - 20Kb |
10 мар 16, 15:36 [18916114] Ответить | Цитировать Сообщить модератору |
tanglir Member Откуда: Сообщений: 28966 |
|
||
11 мар 16, 08:22 [18918190] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
tanglir, тогда попрошу вышей помощи перевести =) я в свою очередь выложу свой проект, вдруг кому-то понадобиться =) |
11 мар 16, 11:12 [18918903] Ответить | Цитировать Сообщить модератору |
tanglir Member Откуда: Сообщений: 28966 |
adminsamara, дельфи у меня под рукой нет, вот по памяти набросал, смотрите.
|
|
11 мар 16, 13:19 [18919543] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
На первом "обороте" он сохраняется в переменной header, которая потом пишется во все куски. |
||
11 мар 16, 14:08 [18919892] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
Хоть убейте, не могу скомпилировать и понять код.... Помогите с рабочей процедурой... Для всех хочу сделать программу =) |
15 мар 16, 14:02 [18933393] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
Не зря же тему прикрепили, хоть что-то полезное сделаю) |
15 мар 16, 14:04 [18933414] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Добавление 1. Файлы в архиве выгрузки имеют длинные имена с GUID-идентификатором. Код же рассчитан на укороченные имена. Вот BAT-файл переименования:
Добавление 2. Программа проверена - работает корректно. Прикладываю архив с проектом и компилированным файлом. В поле источника можно заносить файл как с расширением, так и без него. Никаких проверок на предмет сбоев файловых операций (в т.ч. и на свободное место) не делал - лень. Константы размера блока чтения и количества записей на одну часть взял практически с потолка, кому не влом - можно править, не вылетая за ограничения среды исполнения. Добавление 3. Со всем вышеприведённым кодом провёл только что импорт свежих данных - успешно. К сообщению приложен файл (Divider.zip - 6Kb) cкачать ![]() |
|
18 мар 16, 12:49 [18947685] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Добавление 4. Рукозады, которые выкладывают свежую БД, не следят за выгрузкой. В результате в некоторых записях выгружаемого XML кириллица заменяется энтитьками, и размер данных поля начинает превышать установленную их же собственной схемой данных длину. Соответственно возникают грабли при импорте - ведь LOAD XML не производит конвертацию энтитек в символы. Рекомендую после загрузки данных из файла NORMDOC.XML вставить команду SHOW WARNINGS - это позволит увидеть, с чем именно возникла проблема. Хотя их общее количество (на текущий момент - 18 штук) видно и так... |
18 мар 16, 13:20 [18947898] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Вот перечень (и значения) проблемных на текущий момент записей: mysql> select NORMDOCID, length(DOCNUM) len, char_length(DOCNUM) clen, DOCNUM from NormativeDocument where char_length(DOCNUM)>20; +--------------------------------------+------+------+---------------------------------+ | NORMDOCID | len | clen | DOCNUM | +--------------------------------------+------+------+---------------------------------+ | bacda4e3-d78d-4ce6-8ce2-194edf495c85 | 30 | 30 | 17/57-1066				 | | 99b29e6e-7144-4b2d-bfb3-cc7153119cc4 | 29 | 29 | 011-10/02				 | | bc868c9b-fbe9-4cfa-99e2-170454111774 | 29 | 29 | 379-10/02				 | | 1b418dac-6da3-4b3d-bfed-5304ce51c8f0 | 24 | 24 | 17/53-950			 | | 9a0a357a-2ee7-4d5e-ac90-2e4a7f51603d | 26 | 23 | 			0231/адр | | d66adb25-bcf3-4a58-aac0-c42665c00680 | 26 | 23 | 			0231/адр | | f22523e0-6d58-4517-80e1-f1ddd2e20f02 | 31 | 28 | 			0140/адр	 | | 577e728a-de02-40dc-b79f-c10e1481b454 | 26 | 23 | 			1505/адр | | af3fc532-32be-46d1-a7ea-99b5b23d3a4f | 26 | 23 | 			0263/адр | | 70427238-3203-4d50-88f7-dd8d154b96e7 | 26 | 23 | 			2470/адр | | 752311b6-9228-4dfb-90ad-e4efe2ccdc07 | 26 | 23 | 			2470/адр | | 58348ce7-1fe7-4b4a-b636-2c300f1e4c73 | 26 | 23 | 			2297/адр | | bc46f9a8-fb71-4a10-b082-47aa3e142d8b | 26 | 23 | 			2297/адр | | b90fbc0a-fa35-4e53-bfc4-644a23e80e69 | 26 | 23 | 			1774/адр | | 7497d687-ea18-42d6-a31f-4467a8bfcd6d | 31 | 28 | 			0547/адр	 | | 68fb8a68-f0e7-4e7d-bea2-5852745f524c | 31 | 28 | 			0936/адр	 | | 2477400f-32e9-4505-be94-071ac1bb4279 | 31 | 28 | 1657/адр	07.12.2011	 | | c2ce9fb8-fd82-4606-aa9a-4544788e4875 | 31 | 28 | 1657/адр	07.12.2011	 | +--------------------------------------+------+------+---------------------------------+ 18 rows in set (13.06 sec) В чём именно накосячено - видно. Видно также, как надо поправить скрипт, чтобы не было предупреждений: CREATE TABLE IF NOT EXISTS `NormativeDocument` ( `NORMDOCID` VARCHAR(36) /* NOT NULL */ COMMENT 'Идентификатор нормативного документа', `DOCNAME` VARCHAR(21773) COMMENT 'Наименование документа', -- было 21783 `DOCDATE` DATE COMMENT 'Дата документа', `DOCNUM` VARCHAR(30) COMMENT 'Номер документа', -- было 20 `DOCTYPE` INTEGER /* NOT NULL */ COMMENT 'Тип документа', `DOCIMGID` INTEGER COMMENT 'Идентификатор образа (внешний ключ)' ) ENGINE=MyISAM COMMENT 'Сведения по нормативному документу, являющемуся основанием присвоения адресному элементу наименования'; |
||
18 мар 16, 15:45 [18948996] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Ну и "выправление" таких записей - например, заменой табуляций на пробелы:UPDATE NormativeDocument SET DOCNUM = REPLACE(DOCNUM, '	', ' ') WHERE LOCATE('	', DOCNUM); На текущий момент таких "косых" записей 121 штука. |
18 мар 16, 15:58 [18949135] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34659 |
Это только в normdoc ? |
||
18 мар 16, 17:24 [18949776] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 20960 |
Возможно, что и в других таблицах (и даже в других полях этой) есть такого рода косяки - но я их не искал. Этот вылез исключительно потому, что длина данных была выше заявленной в схеме данных, и сервер ругнулся, что данные усечены. |
18 мар 16, 18:02 [18950021] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34659 |
Akina, Просто я тоже загружал недавно, но НЕ загружал NORMDOC. Пока ничего не нашлось плохого. |
18 мар 16, 19:57 [18950605] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
Может есть у кого select такого типа:область-город-улица-дом |
24 мар 16, 17:10 [18974488] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34659 |
а что на входе? и какая СУБД? Если MySQL, то все сильно непросто... |
||
24 мар 16, 19:10 [18974993] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
MasterZiv, именно она, MYSQL... А что можно сделать, как упростить?! |
24 мар 16, 19:34 [18975056] Ответить | Цитировать Сообщить модератору |
adminsamara Member Откуда: Самара Сообщений: 545 |
делаю в дельфи в комбобоксе выбираю область-в следующем комбобоксе город и т д =) |
||||
24 мар 16, 19:36 [18975061] Ответить | Цитировать Сообщить модератору |
EmilSabitov Member Откуда: Сообщений: 1 |
Akina, ты выручил своим постом! Хочу поддержать тебя и задонатить) Говори куда деньги класть) |
6 май 16, 18:39 [19143962] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / MySQL | ![]() |