|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Ну вот потребовалось. Соответственно задача решена, поделюсь решением. Полная БД выгружается налоговой в двух форматах - DBF и XML. Но с DBF работать неудобно, да и таблицы там нарублены на кучу частей. В общем, сразу решено было использовать исходные данные в XML, тем более что MySQL имеет средства загрузки из них напрямую. Первым делом на основе XSD-схем данных были построены скрипты создания таблиц. Заодно выяснилось, что схемы даны не все, а их содержимое не всегда соответствует файлу с описанием формата выгрузки, размещённому на сайте ФИАС. Но задача несложная, работаем по факту. скрипты создания таблиц Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233. 234. 235. 236. 237. 238. 239. 240. 241. 242. 243. 244. 245. 246. 247. 248. 249. 250. 251. 252. 253. 254. 255. 256. 257.
вспомогательные скриптыМогут потребоваться при обновлении, в текущей работе не использовались Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49.
В качестве движка выбран MyISAM - это ускоряет импорт. Также были отключены (в скриптах - закомментированы) ограничения и первичные индексы - с той же целью. Имея готовые структуры, несложно выполнить импорт данных. Первым делом имена XML-файлов для удобства работы были укорочены. Затем построены запросы импорта данных (исходные файлы были расположены по пути b:\fias). запросы импорта данных Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Импорт всех файлов, кроме самого большого, прошёл быстро и хорошо (большие файлы NORMDOC.XML и ADDROBJ.XML импортировались 2 и 4 минуты соответственно, все остальные практически мгновенно). А вот с самым большим, 16-гигабайтным HOUSE.XML возникла проблема. Сервер импортировал порядка четверти файла, после чего потребление памяти возрастало с исходных 450 Мбайт до 2 Гбайт и процесс обрывался по ошибке недостатка памяти. Было принято решение поделить файл на части и выполнить их импорт. Для нарезки было быстро накидано приложение на VB6, файл поделен на 9 частей по 1,8 Гбайт. Программа нарезки XML-файла. На форме размещены 2 кнопки с именами Start и Exit, и надпись с именем Protocol. Код модуля: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52.
Процесс деления на часты выполнялся прямо из среды VB6Nano и продолжался порядка 20 минут. Затем полученные части были импортированы в базу. Скрипт импорта таблицы по частям Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Импорт прошёл без проблем, каждая часть импортировалась чуть больше 3 минут. Итоговый размер базы данных составил около 9 Гбайт. PS. При импорте было выявлено, что 4 записи таблицы NORMDOC.XML содержат некорректные относительно схемы данные (размер данных превышает размер поля). Но это мелочи... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 17:57 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Дополнительные сведения по среде выполнения. Весь процесс выполнялся локально на рабочей станции. Процессор Е2160 1,8 ГГц. Физической памяти 2 Гбайт. ОС Windows 7 Max SP1 Rus. Server version: 5.6.14-log MySQL Community Server (GPL). Все кодировки (сервера, БД и пр.) - UTF8. Все операции выполнялись непосредственно из UTF-8 консоли. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2015, 18:19 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Полезно будет добавить следующее: Актуальную базу ФИАС в XML можно скачать тут: http://fias.nalog.ru/Public/DownloadPage.aspx Обновления, так же можно скачать там. Обновление нужно накладывать на готовую БД. Обновления необходимо проверять раз в сутки, чтобы не потерять актуальность данных. Дату последнго обновления можно получить так: http://fias.nalog.ru/Public/Downloads/Actual/VerDate.txt ... |
|||
:
Нравится:
Не нравится:
|
|||
07.01.2016, 04:35 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Обновлю ссылку: http://fias.nalog.ru/Updates.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2016, 19:33 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Может программу для нарезки больших файлов сделать на DELPHI ?! Мне не удалось скомпилировать на VB... А я в свою очередь сделаю программу которая автоматом будет создавать/удалять структуру и заливать XML в базу! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 14:49 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
adminsamaraМожет программу для нарезки больших файлов сделать на DELPHI ?! Сделай, если не лень... ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 15:27 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Akina, Я не знаю как нарезать XML... а остальное сделал ... |
|||
:
Нравится:
Не нравится:
|
|||
10.03.2016, 15:36 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
adminsamaraЯ не знаю как нарезать XML...В стартпосте есть "Программа нарезки XML-файла" на барсике. Там нет абсолютно ничего сложного, перевести её на дельфи - дело нескольких минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 08:22 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
tanglir, тогда попрошу вышей помощи перевести =) я в свою очередь выложу свой проект, вдруг кому-то понадобиться =) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 11:12 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
adminsamara, дельфи у меня под рукой нет, вот по памяти набросал, смотрите. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 13:19 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
tanglirТолько я что-то не пойму, откуда возьмётся открывающий тег <Houses> в следующих файлах-кусках. На первом "обороте" он сохраняется в переменной header, которая потом пишется во все куски. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.03.2016, 14:08 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Хоть убейте, не могу скомпилировать и понять код.... Помогите с рабочей процедурой... Для всех хочу сделать программу =) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2016, 14:02 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Не зря же тему прикрепили, хоть что-то полезное сделаю) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2016, 14:04 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Добавление 1. Файлы в архиве выгрузки имеют длинные имена с GUID-идентификатором. Код же рассчитан на укороченные имена. Вот BAT-файл переименования: rename.bat Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Добавление 2. Программа проверена - работает корректно. Прикладываю архив с проектом и компилированным файлом. В поле источника можно заносить файл как с расширением, так и без него. Никаких проверок на предмет сбоев файловых операций (в т.ч. и на свободное место) не делал - лень. Константы размера блока чтения и количества записей на одну часть взял практически с потолка, кому не влом - можно править, не вылетая за ограничения среды исполнения. Добавление 3. Со всем вышеприведённым кодом провёл только что импорт свежих данных - успешно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 12:49 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Добавление 4. Рукозады, которые выкладывают свежую БД, не следят за выгрузкой. В результате в некоторых записях выгружаемого XML кириллица заменяется энтитьками, и размер данных поля начинает превышать установленную их же собственной схемой данных длину. Соответственно возникают грабли при импорте - ведь LOAD XML не производит конвертацию энтитек в символы. Рекомендую после загрузки данных из файла NORMDOC.XML вставить команду SHOW WARNINGS - это позволит увидеть, с чем именно возникла проблема. Хотя их общее количество (на текущий момент - 18 штук) видно и так... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 13:20 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Akinaих общее количество (на текущий момент - 18 штук) видно и так Вот перечень (и значения) проблемных на текущий момент записей: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
В чём именно накосячено - видно. Видно также, как надо поправить скрипт, чтобы не было предупреждений: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 15:45 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Ну и "выправление" таких записей - например, заменой табуляций на пробелы: Код: sql 1. 2. 3.
На текущий момент таких "косых" записей 121 штука. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 15:58 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
AkinaДобавление 4. Рукозады, которые выкладывают свежую БД, не следят за выгрузкой. В результате в некоторых записях выгружаемого XML кириллица заменяется энтитьками, и размер данных поля начинает превышать установленную их же собственной схемой данных длину. Соответственно возникают грабли при импорте - ведь LOAD XML не производит конвертацию энтитек в символы. Рекомендую после загрузки данных из файла NORMDOC.XML вставить команду SHOW WARNINGS - это позволит увидеть, с чем именно возникла проблема. Хотя их общее количество (на текущий момент - 18 штук) видно и так... Это только в normdoc ? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 17:24 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Возможно, что и в других таблицах (и даже в других полях этой) есть такого рода косяки - но я их не искал. Этот вылез исключительно потому, что длина данных была выше заявленной в схеме данных, и сервер ругнулся, что данные усечены. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 18:02 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Akina, Просто я тоже загружал недавно, но НЕ загружал NORMDOC. Пока ничего не нашлось плохого. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2016, 19:57 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
Может есть у кого select такого типа: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2016, 17:10 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
adminsamaraМожет есть у кого select такого типа: Код: sql 1.
а что на входе? и какая СУБД? Если MySQL, то все сильно непросто... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2016, 19:10 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
MasterZiv, именно она, MYSQL... А что можно сделать, как упростить?! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2016, 19:34 |
|
Импорт БД ФИАС в MySQL. Практический опыт.
|
|||
---|---|---|---|
#18+
MasterZivadminsamaraМожет есть у кого select такого типа: Код: sql 1.
а что на входе? и какая СУБД? Если MySQL, то все сильно непросто... делаю в дельфи в комбобоксе выбираю область-в следующем комбобоксе город и т д =) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2016, 19:36 |
|
|
start [/forum/topic.php?fid=47&fpage=22&tid=1828623]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
140ms |
get tp. blocked users: |
1ms |
others: | 55ms |
total: | 275ms |
0 / 0 |