Самый быстрый способ отобразить узел данных + все его атрибуты в PHP? - PullRequest
1 голос
/ 08 июня 2011

Я использую php для того, чтобы взять xml-файлы и преобразовать их в однострочный текст с разделителями табуляции с заданными столбцами (т.е. игнорирует определенные теги, если база данных не нуждается в них, а определенные теги будут пустыми). Проблема, с которой я столкнулся, заключается в том, что мне понадобилось 13 минут, чтобы просмотреть файлы 56k (+ change), что, на мой взгляд, смехотворно медленно. (средняя папка содержит более миллиона xml-файлов) В любом случае, я, вероятно, справлюсь с ней в одночасье, но это совершенно невозможно проверить в разумных пределах, пока я работаю над такими вещами, как отсутствующие файлы и поврежденные файлы и тому подобное.

Мы надеемся, что кто-то может помочь мне ускорить процесс, сами xml-файлы не слишком большие (<1k строк), и мне не нужен каждый тег данных, только некоторые, вот мой метод узла данных: </p>

function dataNode ($entries) {
    $out = "";

    foreach ($entries as $e) {
        $out .= $e->nodeValue."[ATTRIBS]";
        foreach ($e->attributes as $name => $node)
            $out .= $name."=".$node->nodeValue;
    }

    return $out;
}

где $ records - это DOMNodeList, сгенерированный из запросов XPath для нужных мне узлов. Таким образом, вопрос в том, каков самый быстрый способ перейти к целевому узлу данных или узлам (если у меня есть 10 ключевых узлов из моего запроса XPath, мне нужно, чтобы все они были напечатаны из этой функции), и вывести значение узла и все его атрибуты

Я прочитал здесь , что повторение DOMNodeList не является постоянным временем, но я не могу использовать данное решение, потому что одноуровневый элемент нужного мне узла может быть тем, который мне не нужен, или мне нужно вызвать другую функцию форматирования перед тем, как записать ее в файл, и я действительно не хочу запускать узел через гигантский оператор switch для каждой итерации, пытающейся отформатировать данные.

Редактировать: я идиот, у меня была функция записи в цикле обработки, поэтому на каждой итерации приходилось открывать файл, в который я писал, спасибо за вашу помощь, я пытаюсь изучать XSLT прямо сейчас как это кажется очень полезным.

1 Ответ

2 голосов
/ 08 июня 2011

Комментарий будет немного коротким, поэтому я пишу его как ответ:

Трудно сказать, где на самом деле ваша установка может получить выгоду от оптимизации. Возможно, перед загрузкой можно объединить несколько файлов XML вместе.

Исходя из информации, которую вы даете в своем вопросе, я бы предположил, что больше времени занимают дисковые операции, чем разбор XML. Я нашел DomDocument и Xpath довольно быстро даже для больших файлов. Загрузка XML-файла объемом до 60 МБ занимает около 4–6 секунд, а файл размером 2 МБ - только дробь.

Наличие большого количества маленьких файлов (<1 КБ) будет означать большую работу на диске, открытие / закрытие файлов. Кроме того, я понятия не имею, как вы перебираете каталоги / файлы, иногда это также может быть значительно ускорено. Тем более, что вы говорите, что у вас есть миллионы файловых узлов. </p>

Так что, возможно, объединение / объединение файлов - это вариант для вас, который может быть достаточно безопасным, чтобы сократить время на тестирование вашего конвертера.

Если вы столкнулись с отсутствующими или поврежденными файлами, вы должны создать журнал и перехватить эти ошибки. Таким образом, вы можете позволить заданию пройти и позже проверить наличие ошибок.

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

Предложение выше в комментарии о запуске XSLT для файлов также является хорошей идеей для их преобразования в первую очередь. Наличие нового слоя в центре для транспонирования данных может помочь значительно уменьшить общую проблему и снизить сложность.

Этот рабочий процесс с файлами XML мне очень помог:

  1. Предварительная обработка файла (простые текстовые фильтры, необязательно)
  2. Разобрать XML. Это загружается в DomDocument, повторяется XPath и т. Д.
  3. Мой анализатор отправляет события с проанализированными данными, если они найдены.
  4. Анализатор генерирует определенное исключение, если встречаются данные, которые не в ожидаемом формате. Это позволяет реализовать ошибки в собственном парсере.
  5. Все остальные ошибки также преобразуются в исключения.
  6. Исключения могут быть перехвачены и операции завершены. Например. перейти к следующему файлу и т. д.
  7. Logger, Resumer и Exporter (экспорт файла) могут подключаться к событиям. Сортировка по шаблону посетителя.

Я создал такую ​​систему для обработки больших файлов XML, формат которых изменяется. Он достаточно гибок для работы с изменениями (например, замените анализатор новой версией, сохраняя при этом ведение журнала и экспорт). Система событий действительно подтолкнула меня.

Вместо гигантского оператора switch я обычно использую переменную $state для состояния синтаксического анализатора при итерации по доменному списку. $state может быть удобно для возобновления операций позже. Восстановите состояние и перейдите к последней известной позиции, затем продолжите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...