Processing large data with iterator 基于迭代器的大数据量处理改造

  1. 问题描述
  2. 疑问
  3. result
  4. 参考

问题描述

之前优化过一个操作大数据量的脚本,在开发环境数据量少,cengceng就跑完了,结果在线上跑了半天没反应,还要设置运行时间,还要设置最大使用内存等。

其实处理大数据量脚本也是有技巧的,比如实现一个迭代器或者使用yield等。因为开发环境还是php5.4,有时间切换到5.5的时候再试试yield.

下面是基于Iterator接口,并实现了其中的5个方法的情况,

运行时数据:

class OrderLogistics implements Iterator
{
private $key;
public $data;
public $orders = array();
public $orderInfo = array();
/**
*
*
* @var array 业务属性
*/
private $header;
function __construct($month = '05')
{
$this->generatorOrders($month);
}
// 其他的业务方法
public function rewind()
{
reset($this->orders);
}
function current()
{
return current($this->orders);
}
function next()
{
return next($this->orders);
}
function key()
{
return key($this->orders);
}
function valid()
{
return !next($this->orders);
}
}

疑问

基于以上的实现,可以遍历对象的公共属性,既然在外部可以访问,随意访问随意操作。

result

下面和之前的原生的情况效率比一比:

before:

before

after:

after

此前为了能让脚本运行出个结果来,既调整运行时间,还要设置最大内存,现在想来,就是用内存来换取时间的做法,那现在的情况就是用时间来换取内存了,仔细想来,这个内存和运行时间,好像还真是没有办法来追求一个平衡点。

参考

http://www.laruence.com/2012/08/30/2738.html

script>