首页 新闻 赞助 找找看

php循环处理大量数据,如何提高性能?

0
悬赏园豆:5 [待解决问题]

做微信接口的时候,粉丝同步,或者群发模板消息,因为当循环的数据量大的是时候很容易将内存跑满。之前想要redis队列来处理,但是windows 服务器和我的Apach版本不支持,故想问下php循环处理大量数据,如何提高性能?

阿鸠的主页 阿鸠 | 初学一级 | 园豆:2
提问于:2018-03-01 15:37
< >
分享
所有回答(2)
0

意思是你一个数组能把内存占满?多大的数组?

吴瑞祥 | 园豆:29449 (高人七级) | 2018-03-01 15:59

不是,我的意思是for循环里面代码执行的次数太多。

支持(0) 反对(0) 阿鸠 | 园豆:2 (初学一级) | 2018-03-01 16:02

比如用for循环拉取500万微信粉丝到数据库

支持(0) 反对(0) 阿鸠 | 园豆:2 (初学一级) | 2018-03-01 16:04

@阿鸠: 代码执行再多次和内存也没关系啊.

最多也就是1个进数组.一个出数组.2个数组.

支持(0) 反对(0) 吴瑞祥 | 园豆:29449 (高人七级) | 2018-03-01 16:04

@吴瑞祥:可能是我表达不好。我这么问吧,php循环处理大量数据,如何提高性能?

支持(0) 反对(0) 阿鸠 | 园豆:2 (初学一级) | 2018-03-01 16:07
0

只要是集合通常都有  reader 这类东西(即使没有也可以构建类似方式方法),按量取按量处理即可。要想速度快,那么取出数据后把过程并行处理及提高了速度。至于这个并行处理是分机器还是分cpu还是分线程,看你的需求和设施了,也意味着分发数据的策略对应着不同的方法,比如本机线程模式直接内存后扔进线程集合即可,多机那么还需要通讯,通讯接口之下又需要制定策略。即使单机多线程实际上你还应该考虑处理的瓶颈和硬件,前者比如是大量浮点运算类型还是基本数据指令处理运算等,这和后者也有关系,后者比如cpu核数,是否gpu处理等。

花飘水流兮 | 园豆:13560 (专家六级) | 2018-03-01 20:58

兄弟,PHP搞不了多线程这操作吧

支持(0) 反对(0) 阿鸠 | 园豆:2 (初学一级) | 2018-03-02 09:24

@阿鸠: js都还要异步。如果php没有的话 —— 是不是  用户A Request 后 用户B得等A处理完了才处理B?何况乎不一定非要一个进程内嘛,还可以多进程嘛。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2018-03-02 11:10

@花飘水流兮: 你这个思路是用消息队列来处理。我的服务器环境是Windows加上我的Apach支持不了Redis来处理。所以只能用for傻傻去循环,但是处理大量数据的时候,cpu就挂了,你懂我意思吗?

支持(0) 反对(0) 阿鸠 | 园豆:2 (初学一级) | 2018-03-02 11:15

@阿鸠: “for傻傻去循环” —— "只要是集合通常都有  reader 这类东西(即使没有也可以构建类似方式方法)";别瞎提什么具体工具,消息队列难道就不是for出来的?redis就不是for出来的?机器的核心意义就是for,过去是先搞定体力重复劳动,现在在搞脑力体力重复劳动,没有重复还搞机器干什么。

说得你用redis了就是一下搞定一样。

cpu挂 —— 没听过说,如果说是满载并且需要持续等待过久(且代码逻辑无误),那么同等条件下不管你怎么写都无法节约资源(比如我们这里用功耗w),如果你想降低cpu那么 降低 功率p即可,而功耗恒定,意味着需要更多时间。

节约功耗有如下方式:用更低级的语言,减少层次调用(比如去掉操作系统)等;

当然如果 t 不变,直接的方式是增加p。在基本p都无法满足的情况下扯这些有意义吗?(硬件的参数就是软件的理想花销时间,软件只能在这之内)

 

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2018-03-02 11:33

可以,结贴。能否加个微信

支持(0) 反对(0) 阿鸠 | 园豆:2 (初学一级) | 2018-03-05 09:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册