大きな XML を解析する必要があります。f.ex 100mb (それ以上になることもあります)。
例: XML は次のようになります。
<notes>
<note>
<id>cdsds32da435-wufdhah</id>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
x 1000000 different notes(or even more)
</notes>
各メモには一意の ID がありません。XML を解析するとき、最初に特定の ID によるメモが DB に存在するかどうかを確認する必要があります。
問題はパフォーマンスにあります(2時間かかります)。1 つの SELECT で DB からすべての ID を取得しようとしますが (これも大きいです)、毎回 DB に問い合わせる必要はなく、PHP 配列 (メモリ) にそれらがあります。
$sql = "SELECT id FROM 'notes'";
...
$ids = Array with all ids
また、ループ内で xml_parser を使用して XML を解析しました。
while($data = fread($Xml, '512')) {
xml_parse($xmlParser, $data);
}
simple_xml_parser で XML を解析すると、PHP が処理するには大きすぎる変数が生成される可能性があると思います。
そして、メモ ID がある場合は、それが $ids に存在するかどうかを確認します。
if (array_search($note->id, $ids) === FALSE) {
//than insert it
}
しかし、時間がかかりすぎます。PHP には Juddy Arrays http://php.net/manual/en/book.judy.phpと呼ばれる特別な配列が付属していることがわかりましたが、これがこのためのものかどうかは正確にはわかりません。
Memcached を使用して、DB の ID を多くの変数に格納することも考えていますが、適切な解決策を見つけたいと考えています。
DB テーブルには、プロセスを高速化するためのインデックスもあります。XML は毎週成長します :) そして、前回の XML からのすべてのメモと新しいメモが毎回含まれています。
質問?PHPでBIG ARRAYSを高速に解析するには? ジュディ・アレイはこれのためですか?DB のすべての ID を変数に格納することは良い解決策ですか? - PHP では一度に大きくなりすぎる可能性があります。