У мене багато проблем з неефективністю node_save (). Але чи вузол збереже мою проблему? Це в кінцевому підсумку те, що я намагаюся з’ясувати.
Я створив цикл зі 100 000 ітерацій. Я створив мінімальний мінімум, щоб об'єкт було дійсним і правильно зберегти. Ось код збереження вузла:
$node = new stdClass();
$node->type = "test_page";
node_object_prepare($node);
$node->uid = 1;
$node->title = $node_title;
$node->status = 1;
$node->language = LANGUAGE_NONE;
if($node = node_submit($node)){
node_save($node);
}
Ось результати:
Було збережено 100 000 вузлів, кожен з яких використовує node_save (). На завершення пішло 5196,22 секунди. Тобто ТОЛЬко 19 економить секунду.
Як мінімум, це не прийнятно, особливо коли ця людина отримує близько 1200 індивідуальних запитів вставки в секунду , і ця людина отримує 25000 вставок в секунду .
Отже, що тут відбувається? Де вузьке місце? Це функція node_save () і як вона розроблена?
Може це моє обладнання? Моє обладнання - це сервер розробки, на ньому ніхто, крім мене - двоядерний Intel, 3 ГГц, Ubuntu 12.04 з 16 гігами оперативної пам’яті.
У той час як цикл працює, моє використання ресурсів: MySQL 27% CPU, 6M RAM; PHP 22% CPU 2M оперативної пам'яті.
Мою конфігурацію mysql виконав майстер percona .
Mysql каже, що якщо моє використання процесора менше 70%, моя проблема пов'язана з диском . Звичайно, у мене є лише пробіг млини WD Caviar 7200 RPM, але я маю отримувати більше 19 вставок в секунду з нею, сподіваюся!
Не так давно я писав про економію 30 000 вузлів за день . Однак, щоб бути зрозумілим, цей вузол не має нічого спільного з будь-якими зовнішніми силами. Це суто орієнтир, щоб дізнатися, як збільшити швидкість дзвінків до node_save ().
Реально мені потрібно щомісяця заносити 30 000 елементів у базу даних за допомогою node_save. Якщо збереження вузла - це не варіант, мені цікаво, чи можу я написати власну функцію drupal api "node_batch_save ()" або щось, що використовує можливість mysql робити об'ємні вставки за допомогою INSERT-запиту . Думки про те, як до цього підійти?