Php 对数据库中的一组行应用迭代算法

Php 对数据库中的一组行应用迭代算法,php,mysql,Php,Mysql,这个问题对某些人来说似乎太基本了,但请容忍,我已经有一段时间没有处理过像样的数据库编程了 我有一个算法,我需要在PHP/MySQL中编程才能在网站上工作。它在对象数组上迭代执行一些计算(它根据对象的属性对对象进行排序)。在每次迭代中,该算法会在所有集合中运行几次,从整个集合的不同位置访问各种数据。该算法需要几百次迭代才能完成。数组来自数据库 我看到的简单解决方案是获取数据库查询的结果,为查询的每一行创建一个对象,将对象放入数组,并将数组传递给我的算法 然而,当我必须处理数千个项目的数组时,我关心

这个问题对某些人来说似乎太基本了,但请容忍,我已经有一段时间没有处理过像样的数据库编程了

我有一个算法,我需要在PHP/MySQL中编程才能在网站上工作。它在对象数组上迭代执行一些计算(它根据对象的属性对对象进行排序)。在每次迭代中,该算法会在所有集合中运行几次,从整个集合的不同位置访问各种数据。该算法需要几百次迭代才能完成。数组来自数据库

我看到的简单解决方案是获取数据库查询的结果,为查询的每一行创建一个对象,将对象放入数组,并将数组传递给我的算法

然而,当我必须处理数千个项目的数组时,我关心这种解决方案的有效性,因为我所做的基本上是将查询结果镜像到内存中

另一方面,在算法的每次迭代中进行几次数据库查询似乎也是错误的

所以,我的问题是——对于这样的问题,什么是正确的体系结构解决方案?可以将查询结果镜像到内存中吗?如果不是,在这种算法中,使用查询结果的最佳方法是什么

谢谢


更新:我能想到的最接近的问题是搜索引擎对搜索结果的排名——我需要做类似的事情。每个结果都表示为数据库的一行,在计算秩时,将考虑集合中的所有结果。

这实际上取决于手头的情况。可能很少需要做这样的事情,但根据您提供的信息很难判断

尽量隔离数据。例如,如果需要对循环迭代中没有数据依赖关系的数据执行一些独立操作,则可以编写一个查询来更新受影响的行,而不是将它们全部加载到内存中,只将它们写回


简言之,这可能是可以避免的,但在你给我们提供更多信息之前很难说:)

一个对象的计算依赖于另一个对象,还是它们都是独立的?如果它们是独立的,则可以从数据库中加载少量行,并将它们转换为所描述的对象。然后在这些块上运行数百次迭代,然后输出该块的结果。然后继续下一个项目块

这可以降低内存使用率,因为您只处理少量项而不是整个数据集,并避免在数据库上运行多个查询


SQL关键字LIMIT和OFFSET可以帮助您逐块遍历数据。

内存似乎是最好的方法-如果您可以扩展以满足它的要求。否则,您将不得不修改您的算法,以可能使用分而治之的方法-执行类似于合并排序的操作。

如果您正在对数据库进行查询,当结果返回时,它们已经“镜像到内存”。当您使用mysql_fetch_assoc(或equiv)获得结果时,您就有了副本。只需将其用作缓存。

别忘了,过早优化是万恶之源。给它一个机会把所有的东西都复制到内存中。如果这会占用太多内存,那么就对内存进行优化。

使用MySQL编写排名查询也是可能的,您只需要稍微处理一下用户定义的变量。如果您将提供一些输入数据和您将要获得的结果,那么回复将更加详细

您是否可以使用cron作业进行排名,例如每天、每小时或您需要的任何时间,然后将项目排名保存到其行中的字段中


这样,当你调用你的行时,你可以按照排名字段对它们进行排序。

它们都是依赖的,所以我找不到一种方法来处理一个小的子行,我很难给出更多的信息而不写一篇冗长的描述,没有人会喜欢阅读:)我能想到的最接近的问题是搜索引擎对搜索结果的排名——我需要做类似的事情。每个结果都表示为数据库中的一行,在计算秩时,将考虑集合中的所有结果。即使是您给出的示例,也不会一次将所有结果加载到内存中。若您担心系统溢出,那个么您应该对较小的数据集进行操作,并以迭代的方式执行该过程。我认为那个引用被过度使用了。我认为,通过制定合理的设计决策来规划扩张是非常公平的,这些决策一旦实施就不那么容易改变。担心使用4字节数字与使用位移位和加法机制来实现1字节数字的相同数据表示更适合于报价(请注意,此评论没有附带的否决票)。很好,那么他应该是一名工程师,并对预期数据行数进行成本估算,乘以每行数据大小,并确定过程配置文件的大致内存需求。如果这个数字大于可用内存占用减去一些合理的开销,那么他应该考虑设计内存/查询访问权衡。我发现99%的时候,按照我说的去做会更快,让内存不足的错误告诉你需要优化内存。是的,很公平。我不认为几千条记录是太多的排序,如果做得好。。。只是我厌倦了陈词滥调:)真的是这样吗?您想说,在一个包含10000行的表上,每个记录中有~50K个BLOB的“SELECT*FROM xxx”将为单个查询占用500Mb的内存吗?我认为PHP比这更好…谢谢,但这不是一个选项-太多了