【问题标题】:Performance Issue (Nested Foreach Loops, Large Data Set)性能问题(嵌套的 Foreach 循环、大型数据集)
【发布时间】:2013-05-23 17:17:15
【问题描述】:

我正在处理地址标准化的应用程序。我有一个包含 8000 行的数据库表,每行包含一个地址。我的目标是检查每个地址与数据库中的每个其他地址是否相似但不完全匹配,然后输出结果。

目前,我的方法是将 8000 行加载到一个数组中,并使用嵌套的 foreach 循环将地址传递给一个函数,该函数将在找到匹配项时返回 true(并将匹配项存储在数组中以输出所有匹配项之后循环)。

问题是,加载需要很长时间。这通常是你们的处理方式,还是我应该寻找其他解决方案?

示例:“123 garden st. ste. 140”应该匹配“123 garden street suite 140”,但数据库排序的想法让我思考......

非常感谢所有帮助!, 特雷弗·卡瓦诺

【问题讨论】:

标签: php arrays performance foreach nested


【解决方案1】:

使用for 循环,因为foreach 循环是资源密集型的,因为每次交互都会复制元素。虽然我说使用您当前的嵌套循环方法是否正确,但您将调用您的匹配方法 8000^8000 次?这也将非常密集,您可以这样做的另一种方法是使用地址字段上的排序查询数据库,因此您的匹配算法将检查array[i] 地址是否等于array[i+1] 等等,从而消除了需要对于嵌套循环

【讨论】:

  • 你知道..我一直坐在这里重写和重写试图让它更快,但这实际上很有意义,我不知道我是怎么错过它的,哈哈......考虑到我是创建数组,然后在父循环中重新创建它,然后在子循环中再次创建它。我什至不知道为什么我使用了 foreach。谢啦!换完我的陈述后,我会在几篇文章中回复
  • 它不会是 8000^8000,因为您希望将其与自身进行比较。您将第 1 行与 2-8000 进行比较,将第 2 行与 3-8000 进行比较
  • @RyanB,当索引相等时,我不比较。但它仍然需要永远运行。奇怪的是,子循环体内发生的所有事情都是对一个函数的调用,该函数目前只包含一些正则表达式替换语句并且总是返回 false。我知道循环被执行了 64,000,000 次,但是该死..
  • 如果我正确理解原始帖子,他正在数据库中寻找重复项,因此您不会检查自己,而是检查重复项,因此对于每个数组项,您需要搜索整个数组
  • 排序仍然应该将相似的元素聚集在一起,工作将不得不分析相邻的数组元素,你的主要问题是 64m 的匹配尝试。您想尝试消除这种情况
【解决方案2】:

您是否尝试过直接从数据库中检索所有重复的地址?

SELECT addressField
FROM tableName 
GROUP BY addressField 
HAVING COUNT (addressField)>0

该查询应检索数据库表中的所有重复地址。

然后,您可以将该查询嵌入到父查询中以处理重复项,或者只是将结果输出到数组。

【讨论】:

  • 这太棒了,但我实际上是在寻找类似的重复,而不是确切的。例如,“123 garden st. ste. 140”应该匹配到“123 garden street suite 140”
  • 嗯,好吧,我想这可能与全文搜索有关,但我会有点过于复杂!祝你好运:-)
猜你喜欢
  • 2014-05-18
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
相关资源
最近更新 更多