01 марта 2006

Быстрая загрузка XML-файла в бабу занных

Итак, продолжаем серию заметок об убыстрённых методах загрузки файлов разных типов в базу данных.

Коснёмся сегодня XML. Этот формат весьма популярен, поскольку в унифицированной форме представляет данные любого формата, что делает его универсальным средством для обмена данными, но не их хранения, и потому, на мой взгляд, его унифицированность наносит непоправимый ущерб удобству доступа к данным. XML в его стандратном обличье никогда не сравнится в удобстве работы с данными, скажем, с SQL.

Да, возможно есть более современные способы переноса данных из XML-файла в базу данных, однако я поперва воспользовался таким алгоритмом:
  • преобразовать XML в массив;
  • сформировать из массива серию INSERT-запросов;
  • выполнить эти запросы.

Сразу скажу, что этот метод очень медленный во-первых и требует много памяти во-вторых. По умолчанию PHP владеет аж 8 мегабайтами оперативки, и попытки оперативно работать с массивами, преобразованными из 40-мегабайтных прайс-листов в XML-формате - жалкое зрелище.

Другой замедляющий момент - обилие запросов к базе. Даже если веб-сервер и БД стоят на одной машине - просто капец. Как решение, можно использовать группировку INSERT-запросов: один большой INSERT вместо множества маленьких. Но эта же проблема была и при загрузке CSV-файла...

Поэтому совершенно случайно :] мне пришла в голову идея попробовать такой алгоритм:

  • преобразовать XML в массив;
  • закатать весь массив в CSV-файл;
  • использовать быструю загрузку CSV в БД.

И о чудо! Всё летает и свистит! Все счастливы и довольны, хотя PHP по-прежнему тягает безумные по размерам массивы :] Можно попробовать ускорить этот процесс ещё более тем, что закатывать в файл набежавший блок данных, скажем, каждые N строк или при пересечении массивом предела в объёме.

В комментах на php.net есть масса вариантов функций, преобразующих XML в массив, советую брать оттеда, потому что процесс этот не простой.

Закатать весь массив в CSV-файл вполне можно через fputcsv(), только не забудьте проапдейтить PHP до пятой версии либо пишите свой вариант (который будет несомненно медленнее в виду своей интерпретируемости).

Ну а о использовании быстрой загрузки CSV в БД читай предыдущий гет пост.

И всех с началом Весны!

0 комментов:

Отправить комментарий