farac0m

Рейтинг
0
Регистрация
13.09.2010

OZON.ru, спасибо за ссылку. Думаю, что решил обе проблемы, это проблема с нехваткой памяти и проблема с нехваткой выделенного времени для работы скрипта. Решение было приблизительно по такому же принципу, как и в статье, только вот язык не PHP, а Си. Обработка идет по потоковому принципу, из стандартного ввода посимвольно идет выборка интересующих тэгов. При совпадении, идет загрузка всего тэга в буфер, в котором уже происходит непосредственно обработка XML. После обработки формируется запрос SQL на запись результата в БД. Затем, буфер освобождается, и процесс поиска интересующих тэгов повторяется.

В памяти, при обработке, программа занимает около 900 кбайт, причем этот размер практически не зависит от объема файла XML.

Работаю с обработкой XML недавно, опыт небольшой. В начале загрузка XML осуществлялась с помощью переработанного парсера для OZON.ru. Позже выяснилось, что язык PHP крайне не эффективен для обработки такого рода данных. Компилятор PHP формирует невероятно большой код, который к тому же потребляет большие процессорные ресурсы, и обработка большого объема данных становится невозможной. Более того код получается нестабильным, возникают ошибки при обработке. Проблемы на хостинге начались уже при обработке файла размером 14 Мбайт, PHP обработчик уже не в лазил в ограничения хостинга и задача аварийно завершалась. Переходить на более мощный хостинг было бы неоправданным решением. Единственным узким местом был парсер XML написанный на PHP, который можно заменить парсеом на Си. И тогда можно сэкономить на стоимости хостинга и выжать с хостинга максимум.

Парсер на Си был написан, теперь проблем с загрузкой XML не возникает. Но из-за ограничений объема БД у меня нет возможности загрузить XML-файлы больших размеров.

Локально, на домашнем компе, парсер на Си порождает новую проблему, теперь вся нагрузка ложится уже на диск. При добовлении больших файлов, сервер MySQL генерирует большое количество операций с диском. Диск становится занятым на 96-99%, при 10-20% заруженности процессора.