2011-07-15 11 views
0

私は、約20,000アイテムのインベントリを含むXMLファイルを持っています。レコードにはSKUとitemidがあります。私は、XMLファイルを検索し、重複するSKUを見つけたいと思います。XMLファイルの重複レコードを検索するためのコードの最適化

XMLは、私は、このファイルを処理するには、次のPHPコードを書いたこの

<SKUDetails> 
<SKU>AAAAA</SKU> 
<Price currencyID="USD">10</Price> 
<Quantity>4</Quantity> 
<ItemID>11111111</ItemID> 
</SKUDetails> 
<SKUDetails> 
<SKU>BBBBB</SKU> 
<Price currencyID="USD">10</Price> 
<Quantity>10</Quantity> 
<ItemID>2222222</ItemID> 
</SKUDetails> 

のように見えます。約500秒かかります。 xmlファイルの各ノードを調べ、skuとitemidのレコードをデータベースに追加します。 skuがすでにデータベースに存在する場合は、2番目のitemidを追加します。

これを最適化する方法はありますか、これを行う別の方法がありますか?

は、ここでは、コード

$doc = new DOMDocument; 
$doc->load('../_result/'.$_GET["file"].'.xml'); 
$xpath = new DOMXPath($doc); 

$query = "//SKUDetails"; 
$SKUDetailsNodes = $xpath->query($query); 
echo("Total SKUs ".$SKUDetailsNodes->length."<br />\n"); 

if($SKUDetailsNodes->length > 0) { 
foreach ($SKUDetailsNodes as $node) { 
$query = "//ItemID"; 
$ItemIDNodes = $xpath->query($query,$node); 
$ItemID = $ItemIDNodes->item(0)->nodeValue; 

$query = "//SKU"; 
$SKUNodes = $xpath->query($query,$node); 
$SKU = $SKUNodes->item(0)->nodeValue; 

if($SKU != '') { 
    $insert_query = "IF NOT EXISTS ". 
    "(SELECT * FROM dump_inventory WHERE (sku = '$SKU')) ". 
    "INSERT INTO dump_inventory (sku,item1) VALUES ('$SKU',$ItemID) ". 
    "ELSE ". 
    "UPDATE dump_inventory SET item2 = $ItemID WHERE sku = '$SKU'"; 

    if(!$insert_exec = sqlsrv_query($conn,$insert_query)) { 
    print_r(sqlsrv_errors()); 
    } 
} 
} 
+0

あなたの目標は何ですか? SKUとItemIDの一意のレコードセットをデータベーステーブルに挿入することはあなたの目標ですか?または、重複除外を行うためにデータベースを使用しているだけですが、最終的にはHTMLレポート、XMLファイル、SQL挿入文などを生成することですか? –

答えて

0

DITCH DATABASEです!だからこそ長い時間がかかります。リストをメモリに保存するだけです。 20k個のアイテムでさえリストに収まるほど大きいわけではありません!

0

1対多の関係の場合は、おそらくあなたがしていないように、データベースに保存したくないでしょう。 SKUテーブルの1つのテーブルと、SKUテーブルへの外部キー参照を持つアイテムの1つのテーブルを提案します。

また、 XMLからアイテムの配列をアセンブルして、1つのinsert文を実行するとします。これははるかに速くなる可能性が高いです。

関連する問題