php多进程分析大数据 php多线程处理大数据

php采集大数据的方案1、建议php多进程分析大数据你读写数据和下载图片分开,各用不同的进程完成 。
比如说,取数据用get-data.php,下载图片用get-image.php 。
2、多进程的话,php可以简单的用pcntl_fork() 。这样可以并发多个子进程 。
但是php多进程分析大数据我不建议你用fork , 我建议你安装一个gearman worker 。这样你要并发几个,就启几个worker,写代码简单,根本不用在代码里考虑thread?。琾rocess等等 。
3、综上,解决方案这样php多进程分析大数据:
(1)安装gearman worker 。
(2)写一个get-data.php,在crontab里设置它每5分钟执行一次,只负责读数据,然后把读回来的数据一条一条的扔到 gearman worker的队列里php多进程分析大数据;
然后再写一个处理数据的脚本作为worker,例如叫process-data.php,这个脚本常驻内存 。它作为worker从geraman 队列里读出一条一条的数据,然后跟你的数据库老数据比较,进行你的业务逻辑 。如果你要10个并发,那就启动10个process-data.php好了 。处理完后,如果图片地址有变动需要下载图片,就把图片地址扔到 gearman worker的另一个队列里 。
(3)再写一个download-data.php,作为下载图片的worker,同样,你启动10个20个并发随便你 。这个进程也常驻内存运行,从gearman worker的图片数据队列里取数据出来,下载图片
4、常驻进程的话,就是在代码里写个while(true)死循环,让它一直运行好了 。如果怕内存泄露啥的,你可以每循环10万次退出一下 。然后在crontab里设置,每分钟检查一下进程有没有启动,比如说这样启动3个process-data worker进程:
* * * * * flock -xn /tmp/process-data.1.lock -c '/usr/bin/php /process-data.php/dev/null 21'
* * * * * flock -xn /tmp/process-data.2.lock -c '/usr/bin/php /process-data.php/dev/null 21'
* * * * * flock -xn /tmp/process-data.3.lock -c '/usr/bin/php /process-data.php/dev/null 21'
不知道你明白了没有
php 更新大数据时很慢没必要一次性查出100W条 。每次请求3-5W数据update,分页用递归 。
控制好变量内存,不要内存溢出 。
PHP的算法可以实现大数据分析吗1.Bloom filter
适用范围:可以用来实现数据字典 , 进行数据的判重,或者集合求交集
基本原理及要点:
对于原理来说很简单,位数组+k个独立hash函数 。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的 。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字 。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了 。
还有一个比较重要的问题 , 如何根据输入元素个数n,确定位数组m的大小及hash函数个数 。当hash函数个数k=(ln2)*(m/n)时错误率最小 。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合 。但m还应该更大些,因为还要保证bit数组里至少一半为 0,则m 应该=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数) 。
举个例子我们假设错误率为0.01,则此时m应大概是n的13倍 。这样k大概是8个 。
注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数) 。通常单个元素的长度都是有很多bit的 。所以使用bloom filter内存上通常都是节省的 。
扩展:
Bloom filter将集合中的元素映射到位数组中,用k(k为哈希函数个数)个映射位是否全1表示元素在不在这个集合中 。Counting bloom filter(CBF)将位数组中的每一位扩展为一个counter,从而支持了元素的删除操作 。Spectral Bloom Filter(SBF)将其与集合元素的出现次数关联 。SBF采用counter中的最小值来近似表示元素的出现频率 。

推荐阅读