做微信接口的时候,粉丝同步,或者群发模板消息,因为当循环的数据量大的是时候很容易将内存跑满。之前想要redis队列来处理,但是windows 服务器和我的Apach版本不支持,故想问下php循环处理大量数据,如何提高性能?
意思是你一个数组能把内存占满?多大的数组?
不是,我的意思是for循环里面代码执行的次数太多。
比如用for循环拉取500万微信粉丝到数据库
@阿鸠: 代码执行再多次和内存也没关系啊.
最多也就是1个进数组.一个出数组.2个数组.
@吴瑞祥:可能是我表达不好。我这么问吧,php循环处理大量数据,如何提高性能?
只要是集合通常都有 reader 这类东西(即使没有也可以构建类似方式方法),按量取按量处理即可。要想速度快,那么取出数据后把过程并行处理及提高了速度。至于这个并行处理是分机器还是分cpu还是分线程,看你的需求和设施了,也意味着分发数据的策略对应着不同的方法,比如本机线程模式直接内存后扔进线程集合即可,多机那么还需要通讯,通讯接口之下又需要制定策略。即使单机多线程实际上你还应该考虑处理的瓶颈和硬件,前者比如是大量浮点运算类型还是基本数据指令处理运算等,这和后者也有关系,后者比如cpu核数,是否gpu处理等。
兄弟,PHP搞不了多线程这操作吧
@阿鸠: js都还要异步。如果php没有的话 —— 是不是 用户A Request 后 用户B得等A处理完了才处理B?何况乎不一定非要一个进程内嘛,还可以多进程嘛。
@花飘水流兮: 你这个思路是用消息队列来处理。我的服务器环境是Windows加上我的Apach支持不了Redis来处理。所以只能用for傻傻去循环,但是处理大量数据的时候,cpu就挂了,你懂我意思吗?
@阿鸠: “for傻傻去循环” —— "只要是集合通常都有 reader 这类东西(即使没有也可以构建类似方式方法)";别瞎提什么具体工具,消息队列难道就不是for出来的?redis就不是for出来的?机器的核心意义就是for,过去是先搞定体力重复劳动,现在在搞脑力体力重复劳动,没有重复还搞机器干什么。
说得你用redis了就是一下搞定一样。
cpu挂 —— 没听过说,如果说是满载并且需要持续等待过久(且代码逻辑无误),那么同等条件下不管你怎么写都无法节约资源(比如我们这里用功耗w),如果你想降低cpu那么 降低 功率p即可,而功耗恒定,意味着需要更多时间。
节约功耗有如下方式:用更低级的语言,减少层次调用(比如去掉操作系统)等;
当然如果 t 不变,直接的方式是增加p。在基本p都无法满足的情况下扯这些有意义吗?(硬件的参数就是软件的理想花销时间,软件只能在这之内)
可以,结贴。能否加个微信