【问题标题】:Euclidean Distance Calculation in CC中的欧几里德距离计算
【发布时间】:2013-05-02 05:51:45
【问题描述】:

我尝试使用以下代码在 PHP 中计算欧几里得距离。但是花费的时间很长。我想测试我是否在 C 中执行相同的操作是否会更快。输入数据应该从 php 传递,而所有其他数据都存储在 mysql 数据库中。我必须计算 30,000 多张图像的距离,每张图像大约有 900 个属性,我怎样才能使操作更快。那么如何在 C 中比在 PHP 中更快地进行计算呢?我还没有用 C 编程过,所以任何建议都将受到高度赞赏。

PHP中用于距离计算的查询可以总结如下:

SELECT tbl_img.img_id,
       tbl_img.img_path,
       ((pow(($r[9]-coarsewt_1),2))+(pow(($r[11]-coarsewt_2),2))+ ... +(pow(($r[31]-coarsewt_12),2))+
        (pow(($r[36]-finewt_$wt1),2))+(pow(($r[38]-finewt_$wt2),2))+(pow(($r[40]-finewt_$wt3),2))+
        (pow(($r[43]-shape_1),2))+(pow(($r[44]-shape_2),2))+ ...  +(pow(($r[462]-shape_420),2))+
        (pow(($r[465]-texture_1),2))+(pow(($r[466]-texture_2),2))+ ... +(pow(($r[883]-texture_419),2))+(pow(($r[884]-texture_420),2)))
       as distance 
FROM tbl_img 
INNER JOIN tbl_coarsewt 
ON tbl_img.img_id=tbl_coarsewt.img_id 
INNER JOIN tbl_finewt 
ON tbl_img.img_id=tbl_finewt.img_id 
INNER JOIN tbl_shape 
ON tbl_img.img_id=tbl_shape.img_id 
INNER JOIN tbl_texture 
ON tbl_img.img_id=tbl_texture.img_id 
WHERE tbl_img.img_id>=1 AND tbl_img.img_id<=31930 
ORDER BY distance ASC LIMIT 6

【问题讨论】:

  • 问题不在于语言,而在于算法

标签: php mysql c euclidean-distance


【解决方案1】:

正如 Arash Kordi 所说,您的问题不在于语言。该 SQL 将由您的 SQL 服务器执行,并且由于使用的算法,该服务器将成为您的瓶颈,而不是您的脚本编写的语言。如果您切换到 C,您将不会获得任何显着的速度,除非你也改变你的策略。

优化的基本经验法则:

  • 不要使用数据库进行计算。使用数据库获取相关数据,然后用 PHP 或 C 进行计算。

  • (预先计算?)查找数组:分析您的数据,看看您是否可以构建一个查找数组——比如说——pow() 结果,而不是每次都重新计算每个值。如果您有大量重复数据,这将很有帮助。

  • 避免序列化 -- 您能否在数据的不同部分并行运行多个脚本实例以最大化吞吐量?

  • 考虑使用服务器端准备好的语句——它们可能会加快速度。

【讨论】:

  • 我尝试先获取所有数据,但获取过程只需要比上面的 sql 语句更多的时间,所以我认为它在 mysql 中更快。而且我还读到 Mysql 比 PHP 快。如何避免序列化?你可以给一些例如。如您所见,我有 4 个不同的表,因此分别对 4 个表执行计算会提高性能吗?
  • 他们优化的关键是修复算法。除非您缺少表索引之类的基本内容,否则其他任何事情都不会对您的性能产​​生巨大影响。你本质上想达到什么目的?为什么需要快速性能?您不能只等待一次计算并将结果存储在数据库表中,然后您可以在下次需要时从中获取计算值?
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2018-02-14
  • 2020-06-16
  • 2013-04-07
  • 2021-01-31
  • 2015-09-23
相关资源
最近更新 更多