我有一个包含库存的XML文件,大约有20,000件商品。记录有SKU和itemid。我想搜索XML文件并找到重复的SKU。
XML看起来像这样
<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>
我编写了以下PHP代码来处理这个文件。大约需要500秒。 我遍历xml文件中的每个节点,并将记录添加到sku和itemid的数据库中。如果sku已经存在于数据库中,我添加第二个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 :(得分:0)
DATCH THE DATABASE!这就是它花了这么长时间的原因。只需将列表保留在内存中即可。即使是20k的物品也没有那么大可以保留在列表中!
答案 1 :(得分:0)
如果它是一对多的关系,你可能不喜欢;我想按照你的方式将它存储在数据库中。我建议使用一张SKU表和一张带SKU表外键引用的项目表。
此外: 我可能会从XML汇编项目数组,然后运行一个insert语句。这可能要快得多。