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);
}
結果は次のとおりです。
それぞれnode_save()を使用して、100,000のノードが保存されました。完了するまで5196.22秒かかりました。それは19秒だけを節約します。
控えめに言っても、これは受け入れられません。特に、この人物が毎秒約1200の個別の挿入クエリを取得しており、この人物が毎秒25,000の挿入を取得している場合はなおさらです。
それで、ここで何が起こっているのですか?ボトルネックはどこですか?それはnode_save()関数であり、どのように設計されていますか?
それは私のハードウェアでしょうか?私のハードウェアは開発サーバーで、私以外は誰もいません-Intelデュアルコア、3 GHz、16 GBのRAMを搭載したUbuntu 12.04。
ループの実行中の私のリソース使用量は次のとおりです。MySQL27%CPU、6M RAM。PHP 22%CPU 2M RAM。
私のmysql設定はperconaウィザードによって行われました。
Mysqlによると、CPU使用率が70%未満の場合、問題はディスクにバインドされているということです。確かに、私は工場のWD Caviar 7200 RPMしか実行していませんが、1秒あたり19以上の挿入が得られるはずです。
少し前に、1日に30,000ノードを節約することについて書きました。ただし、明確にするために、このノードは外力とは何の関係もありません。これは、node_save()への呼び出しの速度を上げる方法を学ぶための純粋なベンチマークです。
現実的には、node_saveを使用して毎分30,000項目をデータベースに取得する必要があります。ノードの保存がオプションでない場合、独自のdrupal api関数「node_batch_save()」またはINSERTクエリで一括挿入を実行するmysqlの機能を利用する何かを記述できるかどうか疑問に思います。これにアプローチする方法についての考え?