@AFI19

Как правильно распарсить большой xml файл и сохранить данные?

Мне нужно "прочитать" большой xml файл и добавить значения в базу.

Для парсинга использую XMLReader + DOMDocumnet в итоге получаю массив такого вида.

[
    'categories' => [
        0 => [
            'name' => 'Category',
            'id' => 1456,
            'parent_id' => 284
        ]
    ],
    'products' => [
        0 => [
            'category_id' => 1456,
            'id' => 135,
            'available' => true,
            'price' => 22
            ...
        ],
        ....
    ]
]

  1. Как правильно распарсить файл, что бы не получить вылет по "Времени исполнению скрипта" или объёму памяти?

    Я пришел к тому, что нужно сначала:
    • распарсить категории
    • отловить закрытие тега `categories` и записать данные в json
    • дальше собирать товары, но, сохранять в файл не в конце, а к примеру после 100 записи.


    Но, что-то меня смущает в этом порядке.

  2. Как добавить большое количество данных в бд, что бы это минимально сказалось на производительности?

    По факту сейчас для добавления одного товара надо сделать мин. 5 запросов insert (добавить товар, связать с категорией, картинкой, свойствами и т. п.), так же нужны select для проверки уникальности.

Подскажите, как правильно все организовать.
  • Вопрос задан
  • 329 просмотров
Пригласить эксперта
Ответы на вопрос 1
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Самый быстрый способ вставить огромное кол-во данных в MySQL это импорт из csv-файла
В аналогичной задаче, где мне надо было обработать xml на 10+Гб и 150+млн строк для вставки решал в 2 этапа
1. потоковый парсинг xml чтобы не вылетать по памяти, и запись результатов в csv
2. импорт данных из csv в базу через LOAD DATA LOCAL INFILE. Никакой другой метод вставки данных по скорости не смог обойти загрузку из csv файла.

LOAD DATA LOCAL INFILE '{$csv_file}'
INTO TABLE `{$table_tmp}`
FIELDS TERMINATED BY ','
ENCLOSED BY '\"'
LINES TERMINATED BY '\\n'
IGNORE 1 ROWS;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы