1

大きな 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 では一度に大きくなりすぎる可能性があります。

4

2 に答える 2

1

DMOZ データベース(2G xml)を解析したとき 、Java ソリューション (SAX パーサー) を使用しました。最初に、XML (RDF 形式) から MySQL データベースに非常に大きなデータ配列を転送する必要がありました。私の PHP ソリューションは、このタスクを 6 時間以上実行しました。しかし、Java ソリューションは 15 分後に同様のタスクが作成されました。ですから、SAX パーサーに基づく Java ソリューションを使用してみてください。

于 2012-04-11T07:33:21.923 に答える
1

アイテムを挿入する前に、アイテムが DB に存在するかどうかを確認する必要がありますか? DBに「存在しない場合は挿入する」ように指示できます。IDに一意のキーを付けてINSERT IGNORE.

于 2012-04-11T08:16:57.923 に答える