Программное изменение большого числа нод

Пнд, 09/02/2015 - 13:15

Есть скрипт, который изменяет ноды в цикле (2000-3000 нод за запуск).
Ноды грузяться node_load'ом и сохраняются node_save по одной штуке, скрипт работает крайне медленно. Какие есть альтернативные варианты? Вручную писать запрос конечно не хотелось бы- в ноде большой количество различных полей

0 Спасибо

Комментарии

Аватар пользователя sas@drupal.org
2 года 2 months назад sas@drupal.org #

Multiply - нет

0 Спасибо
Аватар пользователя lohness
2 года 2 months назад lohness #

А если сохранять ноды с помощью drupal_write_record? Ревизии не использую, самое главное обновить данные. Или это не даст особого прироста в скорости?

0 Спасибо
Аватар пользователя mbaev
2 года 2 months назад mbaev #
lohness написал:
Или это не даст особого прироста в скорости?

Даст, но это не try way.
Попробуйте node_load_multiple (немного ускорит).

С другой стороны если в ноде много полей, а вам нужно всего лишь проставить дату обновления, тогда не виду ничего страшного, чтобы обновить запросом (тем же drupal_write_record)

0 Спасибо
Аватар пользователя lohness
2 года 2 months назад lohness #

Памяти хватило бы на загрузку сразу всех нод :))
Обновляются как раз поля нод, причем практически каждое

0 Спасибо
Аватар пользователя mbaev
2 года 2 months назад mbaev #

В таком случае лучше делать через пакетные операции. Работу не ускорит, но будет правильнее.

0 Спасибо
Аватар пользователя kstukstu
2 года 2 months назад kstukstu #

Кроме пакетных операций есть смысл подумать над очередями - выполнять автоматически постепенно в фоновом режиме...

0 Спасибо
Аватар пользователя lohness
2 года 2 months назад lohness #

А как вообще работает node_save? Если я загружаю ноду node_load и сразу ее сохраняю друпал обновит только дату редактирования или сделает UPDATE по всем полям? Другими словами есть ли внутри этой функции механизм проверки были ли изменены данные?

0 Спасибо
Аватар пользователя lohness
2 года 2 months назад lohness #

Проверил сам, даже если загрузить ноду node_load(), а потом сразу ее сохранить node_save все таблицы field_data_[название_поля] и field_revision_[название_поля] обновляются (DELETE, INSERT). Это прискорбно. Страница просто загружающая ноду генерирует 150 запросов (Ubercart еще и свои таблицы дергает).

Есть ли способы как-то оптимизировать это?

0 Спасибо