[Решено] Скорость, импорт 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 Thanks

Комментарии

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

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

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

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

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

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

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

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

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

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

Аватар пользователя bsyomov
bsyomov 11 месяцев назад
1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тест.
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 мин