Быстрая загрузка XML-файла в бабу занных
Коснёмся сегодня XML. Этот формат весьма популярен, поскольку в унифицированной форме представляет данные любого формата, что делает его универсальным средством для обмена данными, но не их хранения, и потому, на мой взгляд, его унифицированность наносит непоправимый ущерб удобству доступа к данным. XML в его стандратном обличье никогда не сравнится в удобстве работы с данными, скажем, с SQL.
Да, возможно есть более современные способы переноса данных из XML-файла в базу данных, однако я поперва воспользовался таким алгоритмом:
- преобразовать XML в массив;
- сформировать из массива серию INSERT-запросов;
- выполнить эти запросы.
Сразу скажу, что этот метод очень медленный во-первых и требует много памяти во-вторых. По умолчанию PHP владеет аж 8 мегабайтами оперативки, и попытки оперативно работать с массивами, преобразованными из 40-мегабайтных прайс-листов в XML-формате - жалкое зрелище.
Другой замедляющий момент - обилие запросов к базе. Даже если веб-сервер и БД стоят на одной машине - просто капец. Как решение, можно использовать группировку INSERT-запросов: один большой INSERT вместо множества маленьких. Но эта же проблема была и при загрузке CSV-файла...
Поэтому совершенно случайно :] мне пришла в голову идея попробовать такой алгоритм:
- преобразовать XML в массив;
- закатать весь массив в CSV-файл;
- использовать быструю загрузку CSV в БД.
И о чудо! Всё летает и свистит! Все счастливы и довольны, хотя PHP по-прежнему тягает безумные по размерам массивы :] Можно попробовать ускорить этот процесс ещё более тем, что закатывать в файл набежавший блок данных, скажем, каждые N строк или при пересечении массивом предела в объёме.
В
Закатать весь массив в CSV-файл вполне можно через fputcsv(), только не забудьте проапдейтить PHP до пятой версии либо пишите свой вариант (который будет несомненно медленнее в виду своей интерпретируемости).
Ну а о использовании быстрой загрузки CSV в БД читай предыдущий гет
И всех с началом Весны!
0 комментов:
Отправить комментарий