美文网首页
php 使用yield 生成器解决处理大数据量内存泄露问题 20

php 使用yield 生成器解决处理大数据量内存泄露问题 20

作者: 阿然学编程 | 来源:发表于2023-02-27 15:11 被阅读0次
        /**
         * yield 生成器处理数组
         * 减少内存开销
         * @param $data
         * @param int $siez
         * @return \Generator
         */
    function yieldData($data, $size = 0, $key = false)
    {
        if ($size > 0) {
            // 大数据切割成多个小数组
            $chunkData = array_chunk($data, $size, $key);
            unset($data);
            foreach ($chunkData as $chunk) {
                foreach ($chunk as $item) {
                    yield $item;
                }
                unset($chunk);
            }
            unset($chunkData);
        } else {
            foreach ($data as $item) {
                yield $item;
            }
        }
    }
    
    • 调用示例
        public function index()
        {
            $data = Db::name('综转明细')->select();
            //使用yield生成器处理数据减少内存开销
            $yieldData = $this->yieldData($data);
    //        $yieldData = $this->yieldData($data, 10,true);
            foreach ($yieldData as $v) {
                //其他逻辑处理
                dump($v);
            }
        }
    
    • for循环
    function arrayInBatches($bigArray, $batchSize)
    {
        $count = count($bigArray);
        $batchCount = ceil($count / $batchSize);
        for ($i = 0; $i < $batchCount; $i++) {
            $batch = array_slice($bigArray, $i * $batchSize, $batchSize);
            // Do some processing on $batch
            yield $batch;
        }
    }
    
    • 调用示例
        public function test()
        {
            $list = Db::table('dd_综转明细')->select();
            $res = $this->arrayInBatches($list, 20);
            foreach ($res as $v) {
                dump($v);
            }
        }
    

    相关文章

      网友评论

          本文标题:php 使用yield 生成器解决处理大数据量内存泄露问题 20

          本文链接:https://www.haomeiwen.com/subject/dlghldtx.html