Комментарий будет немного коротким, поэтому я пишу его как ответ:
Трудно сказать, где на самом деле ваша установка может получить выгоду от оптимизации. Возможно, перед загрузкой можно объединить несколько файлов XML вместе.
Исходя из информации, которую вы даете в своем вопросе, я бы предположил, что больше времени занимают дисковые операции, чем разбор XML. Я нашел DomDocument и Xpath довольно быстро даже для больших файлов. Загрузка XML-файла объемом до 60 МБ занимает около 4–6 секунд, а файл размером 2 МБ - только дробь.
Наличие большого количества маленьких файлов (<1 КБ) будет означать большую работу на диске, открытие / закрытие файлов. Кроме того, я понятия не имею, как вы перебираете каталоги / файлы, иногда это также может быть значительно ускорено. Тем более, что вы говорите, что у вас есть миллионы файловых узлов. </p>
Так что, возможно, объединение / объединение файлов - это вариант для вас, который может быть достаточно безопасным, чтобы сократить время на тестирование вашего конвертера.
Если вы столкнулись с отсутствующими или поврежденными файлами, вы должны создать журнал и перехватить эти ошибки. Таким образом, вы можете позволить заданию пройти и позже проверить наличие ошибок.
Кроме того, если возможно, вы можете попытаться возобновить рабочий процесс. Например. если возникает ошибка, текущее состояние сохраняется и в следующий раз вы можете продолжить в этом состоянии.
Предложение выше в комментарии о запуске XSLT для файлов также является хорошей идеей для их преобразования в первую очередь. Наличие нового слоя в центре для транспонирования данных может помочь значительно уменьшить общую проблему и снизить сложность.
Этот рабочий процесс с файлами XML мне очень помог:
- Предварительная обработка файла (простые текстовые фильтры, необязательно)
- Разобрать XML. Это загружается в DomDocument, повторяется XPath и т. Д.
- Мой анализатор отправляет события с проанализированными данными, если они найдены.
- Анализатор генерирует определенное исключение, если встречаются данные, которые не в ожидаемом формате. Это позволяет реализовать ошибки в собственном парсере.
- Все остальные ошибки также преобразуются в исключения.
- Исключения могут быть перехвачены и операции завершены. Например. перейти к следующему файлу и т. д.
- Logger, Resumer и Exporter (экспорт файла) могут подключаться к событиям. Сортировка по шаблону посетителя.
Я создал такую систему для обработки больших файлов XML, формат которых изменяется. Он достаточно гибок для работы с изменениями (например, замените анализатор новой версией, сохраняя при этом ведение журнала и экспорт). Система событий действительно подтолкнула меня.
Вместо гигантского оператора switch я обычно использую переменную $state
для состояния синтаксического анализатора при итерации по доменному списку. $state
может быть удобно для возобновления операций позже. Восстановите состояние и перейдите к последней известной позиции, затем продолжите.