[Решено] Скорость, импорт JSON (xml, csv) с помощью feeds

Аватар пользователя baklanaft

Кто-то сталкивался с проблемами в скорости импорта JSON файлов, через feeds?
Ооочень медленно.
Настройки типа Skip hash check (внутри feeds) и $conf['feeds_process_limit'] не работает, виснет при 100.
Примерно 30к+ нод, обычные текстовые данные.
*если сравнивать с csv, то быстрее раза в 2 минимум, но csv не подходит.
--
Не совсем решение, но несколько действий связанных с оптимизацией помогут ускорить процесс:
1. Отключить и удалить (через меню) ненужные (неиспользуемые, необязательные, грузящие систему) модули.
2. Оптимизируем базу MySQL через phpMyAdmin (открываем большие таблицы, наживаем кнопку оптимизировать), это же можно сделать с помощью DB Maintenance (не пробовал).
3. Удаляем ревизии таблиц в базе Field SQL norevisions, настраиваем при импорте.
4. Переезжаем на PostgreSQL - решение.
5. При импорте можно поэкспериментировать с параметрами, зависит уже от сервера и его настроек. Подробно.
вкратце, 3 способа импорта
- батч, через браузер использует джаву, если слетело
- делаем через бэкграунд процесс (рекомендую для этого поставить Ultimate Cron)
- через драш, команды.

На скорость импорта влияют параметры:
- длина поля
- длина урла
- изображения, особенно если внешние линки через модуль Media
- связанные сущности

В итоге получилось, парсер csv, 10к нод за 3.02 минуты.

Модули и темы:
Ключевые слова:
Тип материала:
Версия Drupal:
0 Спасибо

Комментарии

Аватар пользователя sas@drupal.org
sas@drupal.org 9 месяцев назад

Самое бытстрое с внешнего url + xml

0 Спасибо
Аватар пользователя baklanaft
baklanaft 9 месяцев назад

с xml прироста нет, аналогично что и json.
что подразумевается под внешним url?

0 Спасибо
Аватар пользователя dgastudio
dgastudio 9 месяцев назад

ничего толкового.
фидс сам по себе довольно таки медленный модуль. оптимально, написать что то свое

0 Спасибо
Аватар пользователя baklanaft
baklanaft 9 месяцев назад

для меня не оптимально

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Json тоже декодится ядром пхп. Тут проблема в том, что и xml и json имеют открывающий и закоывающий тэг, поэтому при большом объёме данных весь этот объём сперва должен уместиться в памяти, пройти валидацию и уже только потом обрабатываться. Если импортировать десятки тысяч записей за раз, то может даже батч упасть, т.к. не хватит экзекьюшн тайма для формирования массива операций. Поэтому надо смотреть в сторону разбиения массива данных на порции.

0 Спасибо
Аватар пользователя bsyomov
bsyomov 9 месяцев назад 1

Вообще говоря, это совсем не обязательно - с помощью xml_reader делаются потоковые парсеры XML, работающие не с целым документом, и как раз предназначенные для больших объёмов данных.
Вот тут можно почитать, если интересно, про разные возможности php по разбору XML и про потоковые парсеры в частности: https://www.ibm.com/developerworks/ru/library/x-xmlphp2/

Аватар пользователя baklanaft
baklanaft 9 месяцев назад

да, json от xml мало чем отличается, просто работает ровно по сравнению с csv.
я так понимаю, со скоростью придется смириться.

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Цсв - вообще самый мудацкий формат. Если поле содержит хтмл, то 100%, что данные развалятся. Если файл не докачался - никто об этом не узнает. Постоянные проблемы в экселе с кодировкой. Кстати, если надо редактировать в экселе, то нужно смотреть в сторону xls , т.к. это бинарный хмл или в сторону xlsx - это вообще обычный хмл, только зипованный.

0 Спасибо
Аватар пользователя deadie
deadie 9 месяцев назад

Неправда твоя насчёт xlsx. То что эксель открывает такой "xlsx" не говорит ни о чем.

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

В том то и дело, что эксель сам создаёт такие файлы. Можно открыть эксель, создать в нём таблицу, сохранить в xlsx, затем переименовать файл в zip, разархивировать и убедиться самому.

0 Спасибо
Аватар пользователя deadie
deadie 9 месяцев назад

Формально, да. Но, всё ж, это не "банально заархивированный xml".. можно убедиться, сжав любой xml-файл и переименовав его в xlsx

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Ну блин, там у xslx целая структура папок. Если повторить эту структуру и структуру самих файлов, то должно работать)) Т.е. стопроцентнооно работает только в одну сторону, т.к. xslx - это подмножество xml.

0 Спасибо
Аватар пользователя bsyomov
bsyomov 9 месяцев назад

Парснг XLS и XSLX штука не надёжная, сложная и ресурсоёмкая.

  1. Форматы не документированы.
  2. В них могут быть не сырые данные табличные, а вычисляемые поля и сложные формулы, даже в простеньком прайсе.
  3. Это не форматы обмена данными, это форматы упаковки состояния документа.
0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Что значит не документированы? Описаний этих форматов полно. Есть библиотеки для работы с ними. Что касается формул - да, надо удалять, оставлять значения. И для обмена данными действительно не подходит, но для контент-менеджмента идеально - сделал выгрузку, отредактировал, что нужно, добавил, что нужно и загрузил обратно.

0 Спасибо
Аватар пользователя bsyomov
bsyomov 9 месяцев назад

Библиотеки для работы с XLS сделаны не по документации на формат, а методом реверс инжиниринга, и работают не со всеми возможностями формата и близко и с разными проемами и артефактами.
С XLSX, всё немного лучше - формат сам проще.

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Самый гемор, что phpexcel несовместима с php7

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Класс! Спасибо! У меня просто phpexcel стоит версия 1.8.0 на старых проектах, которые мне достались в сопровождение.

0 Спасибо
Аватар пользователя baklanaft
baklanaft 9 месяцев назад

Ускорение импорта перешла в обсуждение форматов.

0 Спасибо
Аватар пользователя baklanaft
baklanaft 9 месяцев назад

т.е. всё упирается в возможности железа? оптимизация и тд? по поводу запорожца - есть видосы на ютубе...

0 Спасибо
Аватар пользователя sas@drupal.org
sas@drupal.org 9 месяцев назад

>Ооочень медленно.
А можно узнать сколько это в секундах?
А сколько Вы хотите?

0 Спасибо
Аватар пользователя baklanaft
baklanaft 9 месяцев назад

json и xml, 36к (4колонки, просто текст, символов мало) - около 5-6 часов.

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Я максимум порядка 3000 заливал, но там колонок было штук 20 и импорт занимал около часа.

0 Спасибо
Аватар пользователя sas@drupal.org
sas@drupal.org 9 месяцев назад

Кнопки увеличить, шрифт уменьшить, сделать красиву галерею, страница должна загружаться очень быстро, что не ясно - звоните ... :)

0 Спасибо
Аватар пользователя sas@drupal.org
sas@drupal.org 9 месяцев назад

xml заливка ~ 24 K товаров с картинками , порядка получаса.

0 Спасибо
Аватар пользователя gun_dose
gun_dose 9 месяцев назад

Таки шаббат уже ведь

0 Спасибо
Аватар пользователя baklanaft
baklanaft 9 месяцев назад

Тест.
1000 полей, 2 колонки
колонка 1 - gid - номер - уникальное значение через UUID
колонка 2 - name - название поля - не уникальное
-
php 5.5.38
max_execution_time 3000
max_input_time -1
memory_limit 256M
-
сервер (виртуальный хостинг)
RAM1.3 GB
-
feeds 7.x-2.0-beta3
импорт - batch ajax
загрузка файлов - по кнопке
Node processor
Insert new Материалы
Update existing Материалы
Формат текста - plain text
Skip non-existent Материалы
-
$conf['feeds_process_limit'] = 50; (по умолчанию, больше 150 кладет сервер)
$queues = array(); (хак модуля, особых резульататов не дает)
$queues['feeds_source_import'] = array(
'worker callback' => 'feeds_source_import',
'time' => 300,
);
--
CSV parser ~ 6.59-7.25 мин (ели ковырять процесс лимит)
XML Xpath parser ~ 8.30 мин

0 Спасибо