Sto riscontrando molti problemi con l'inefficienza di node_save (). Ma il nodo salva il mio problema? Questo è in definitiva quello che sto cercando di scoprire.
Ho creato un ciclo con 100.000 iterazioni. Ho creato il minimo indispensabile affinché l'oggetto nodo sia valido e salvato correttamente. Ecco il codice di salvataggio del nodo:
$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);
}
Ecco i risultati:
Sono stati salvati 100.000 nodi, ognuno usando node_save (). Per completare sono stati necessari 5196,22 secondi. Ciò significa che SOLO 19 risparmia un secondo.
Per non dire altro, ciò non è accettabile, soprattutto quando questa persona riceve circa 1200 query di inserimenti individuali al secondo e questa persona riceve 25.000 inserimenti al secondo .
Allora, cosa sta succedendo qui? Dov'è il collo di bottiglia? È con la funzione node_save () e come è progettata?
Potrebbe essere il mio hardware? Il mio hardware è un server di sviluppo, nessuno tranne me: Intel dual core, 3Ghz, Ubuntu 12.04 con 16 GB di RAM.
Mentre il ciclo esegue il mio utilizzo delle risorse è: MySQL 27% CPU, 6M RAM; PHP 22% CPU 2M RAM.
La mia configurazione mysql è stata fatta dal mago percona .
Mysql afferma che se il mio utilizzo della CPU è inferiore al 70%, il mio problema è legato al disco . Certo, ho solo una corsa del mulino WD Caviar 7200 RPM, ma dovrei ottenere più di 19 inserti al secondo con esso spero!
Non molto tempo fa ho scritto sul salvataggio di 30.000 nodi in un giorno . Tuttavia, per essere chiari, questo nodo non ha nulla a che fare con alcuna forza esterna. È puramente un punto di riferimento per sapere come aumentare la velocità delle chiamate a node_save ().
Realisticamente, ho bisogno di ottenere 30.000 elementi nel database ogni minuto usando node_save. Se il salvataggio del nodo non è un'opzione, mi chiedo se posso scrivere la mia funzione di API drupal "node_batch_save ()" o qualcosa che sfrutti la capacità di mysql di fare inserimenti di massa con la query INSERT . Pensi su come affrontare questo?