多进程如何共享大型数组?

dingfei

php进程中数组占用5Gb内存,随着不断循环计算数据在不断的变化。
 
其他进程,如何去读取这个数组里面的数据?通过redis、GlobalData等都不行,因为要保存到redis、GlobalData需要先把数组序列化,然后保存。然后读取的又需要反序列化,非常耗时间
 
有没有什么办法?求各位大佬指点迷津

  1. 没有办法共享这个数组的内存地址给其他进程?
  2. 有没有其他不比php数组性能差的数据结构 ?
3888 2 0
2个回答

walkor

进程间实时同步5G的数据最好是增量同步,既同步只同步改变的部分,不改变的部分不用同步,这样可以大大加快同步速度。但是这样对于开发者要求较高,并且容易出现数据不一致。
 
最好的方法就是只用一个进程装这5G数据,需要这5G数据的时候向这个进程发起请求获得所需数据。另外redis也有丰富的数据结构比如hash 都可以做到只同步某个key的数据,而不用把所有数据获取出来再存进去。

  • dingfei 2019-05-14

    受教了。试了一下,发现问题是redis并发太慢了,数据有2千万条,而redis每秒并发才10万级别,保存数据来不及。

  • dingfei 2019-05-14

    子进程可以共享父进程的数据。 workerman能做到动态创建子进程吗?收到客户端发来的消息就创建一个子进程,执行完就退出

  • walkor 2019-05-14

    不支持动态创建子进程。一个消息创建一个子进程开销非常大

  • dingfei 2019-05-16

    @1:感谢解答!

dignfei

共享内存可以

  • 暂无评论
年代过于久远,无法发表回答
🔝