【问题标题】:Optimizing code to search for duplicate records in an XML file优化代码以在 XML 文件中搜索重复记录
【发布时间】:2011-07-16 05:33:53
【问题描述】:

我有一个包含库存的 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());
  }
 }
}

【问题讨论】:

  • 你的目标是什么?您的目标是将 SKU 和 ItemID 的唯一记录集插入到数据库表中吗?或者你只是使用数据库进行重复数据删除,但最终状态是生成 HTML 报告、XML 文件、SQL 插入语句等??

标签: php sql xml


【解决方案1】:

抛弃数据库!这就是为什么它需要这么长时间。只需将列表保存在内存中即可。即使是 20k 项,也没有那么大的列表!

【讨论】:

    【解决方案2】:

    如果它是一对多的关系,您可能不希望以您现在的方式将其存储在数据库中。我建议一张 SKU 表和一张带有外键引用 SKU 表的项目表。

    还有: 我可能会从 XML 中组装项目数组,然后运行一个插入语句。这可能会快得多。

    【讨论】:

      猜你喜欢
      • 2012-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 2017-05-18
      • 1970-01-01
      相关资源
      最近更新 更多