返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php使用yield处理大数据文件
  • 316
分享到

php使用yield处理大数据文件

php开发语言yield 2023-09-04 11:09:49 316人浏览 八月长安
摘要

1.概述 yield和return有点像,它是一个生成器,对PHP应用的性能有非常大的影响, 只有在调用的时候才会执行,并不产生多余的值,比如读取一个很大的文件或者计算大量的数据时,如果直接读取很有可能内存就爆了,而yield就可以做到

1.概述

yield和return有点像,它是一个生成器,对PHP应用的性能有非常大的影响, 只有在调用的时候才会执行,并不产生多余的值,比如读取一个很大的文件或者计算大量的数据时,如果直接读取很有可能内存就爆了,而yield就可以做到把数据一行行读取到php运行内存,并非一次性读取到php运行内存,这样在运行时就会节省大量的内存;还有就像在循环数据库的所有记录的时候,这个记录可能会很大,例如100万行,那么通过传统的办法就行不通了,首先通过WEB访问,php有超时时间,默认是30秒,那么就只能通过php cli的方式来执行,这样就没有超时时间了,但由于数据量太大,php循环时需要将数据全部载入内存中执行,由于数据量太大,php会报Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes)的错误,php默认的内存限制为128M,虽然可以通过修改php.ini中memory_limit的选项的值来提高内存限制,但始终不是最优的解决办法,这时通过生成器函数就可以极大节省内存开销

2.案例引入

先看一个简单的函数

ion createRange($number){  $data = [];  for($i=0;$i<$number;$i++){      $data[] = time();  }  return $data;}?>

这是一个非常常见的PHP函数,我们在处理一些数组的时候经常会使用。这里的代码也非常简单:

创建一个函数, 函数内包含一个for循环,循环的把当前时间放到data里面for循环执行完毕,把data返回出去。

再写一个函数,把这个函数的返回值循环打印出来:

';}

在浏览器里面看一下运行结果,非常赖斯,没有任何问题,这时需要思考一个问题:

        在调用函数createRange的时候给$number的传值是10,一个很小的数字,如果现在传递一个值10000000(1000万),那么,在函数createRange里面,for循环就需要执行1000万次,且有1000万个值被放到$data里面,而$data数组在是被放在内存里的,所以,在调用函数时候会占用大量内存,非常的不友好,这时生成器(yield)就闪亮登场了,修改一下代码,创建生成器

这段代码,删除了数组$data,也没有返回任何内容,而是在time()之前使用了一个关键字yield

使用生成器

';}?>

运行上面的代码,可以发现:

        输出的值和第一次没有使用生成器的不一样,这里的值(时间戳)中间间隔了1秒,这里的间隔一秒其实就是sleep(1)造成的,但是为什么第一次没有间隔呢,那是因为:未使用生成器时,createRange函数内的for循环结果被很快放到$data中,并且立即返回,所以,foreach循环的是一个固定的数组; 使用生成器时,createRange的值不是一次性快速生成,而是依赖于foreach循环,foreach循环一次,for执行一次

3.上述代码的执行过程

';}?>

(1).首先调用createRange函数,传入参数10,但是for值执行了一次然后停止了,并且告诉foreach第一次循环可以用的值

(2).foreach开始对$result循环,进来首先sleep(1),然后开始使用for给的一个值执行输出

(3).foreach准备第二次循环,开始第二次循环之前,它向for循环又请求了一次

(4).for循环于是又执行了一次,将生成的时间戳告诉foreach

(5).foreach拿到第二个值,并且输出。由于foreach中sleep(1),所以,for循环延迟了1秒生成当前时间,所以,整个代码执行中,始终只有一个记录值参与循环,内存中也只有一条信息

结果:

        所以无论开始传入的$number有多大,由于并不会立即生成所有结果集,所以内存始终是一条循环的值

4.生成器的原理:

生成器yield关键字不是返回值,他的专业术语叫产出值,只是生成一个值,代码中foreach循环其实是PHP在使用生成器的时候,会返回一个Generator类的对象,foreach可以对该对象进行迭代,每一次迭代,PHP会通过Generator实例计算出下一次需要迭代的值,这样foreach就知道下一次需要迭代的值了,而且,在运行中for循环执行后,会立即停止。等待foreach下次循环时候再次和for索要下次的值的时候,for循环才会再执行一次,然后立即再次停止,直到不满足条件不执行结束

5.案例演示

5.1 读取text文件  我们创建一个text文本文档,并在其中输入几行文字,示范读取

 $value) {  # code...  echo $value.'
';}

通过上图的输出结果我们可以看出代码完全正常,但是,背后的代码执行规则却一点儿也不一样,使用生成器读取文件,第一次读取了第一行,第二次读取了第二行,以此类推,每次被加载到内存中的文字只有一行,大大的减小了内存的使用。这样,即使读取上G的文本也不用担心,完全可以像读取很小文件一样编写代码

5.2 读取数据库用户数据,处理相关逻辑

参考:redis实现统计活跃用户  功能

get_bitmap_all($key);        if ($userIds) {            //循环查询(使用yield生成器)用户表,处理用户逻辑相关功能            $i_userIds = $this->YieldUser($userIds);            foreach ($i_userIds as $userId) {                 //获取通过生成器处理的用户id,处理用户相关功能                 ...            }        }            }           public function get_bitmap_all($key)    {        //服务端redis        $redis = Yii::$app->redis;        $result = [];        $value = $redis->get($key);        if ($value) {                        $bitmap = unpack('C*', $value);            if ($bitmap) {                foreach ($bitmap as $key => $number) {                    // 下标是从1开始的; 1个字节8位                    $offset = ($key - 1) * 8;                    // 过滤没有标记的字节段                    if ($number) {                        for ($i = 0; $i < 8; $i++) {// 遍历这个字节的每一位,是否有为1的值,如果有,那就记录这个位置的偏移量,就是用户idif (($number >> $i & 1) == 1) {    // 8位范围是0~7,因为Redis是高位到低位存储,所以要反过来计算偏移量    $result[] = $offset + (7 - $i);}                        }                    }                }            }        }        return $result;    }        public function YieldUser($userIds) {        //使用yield生成器        foreach ($userIds as $userId) {            yield $userId;        }    }}

到这里,php使用yield处理大数据文件基本功能就完成了

来源地址:https://blog.csdn.net/zhoupenghui168/article/details/129797758

--结束END--

本文标题: php使用yield处理大数据文件

本文链接: https://lsjlt.com/news/393424.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • php使用yield处理大数据文件
    1.概述 yield和return有点像,它是一个生成器,对PHP应用的性能有非常大的影响, 只有在调用的时候才会执行,并不产生多余的值,比如读取一个很大的文件或者计算大量的数据时,如果直接读取很有可能内存就爆了,而yield就可以做到...
    99+
    2023-09-04
    php 开发语言 yield
  • php 使用 yield 批量处理文件并读取大数据导入数据库
    生成器的核心是一个 yield 关键字,使用yield php会返回一个属于Generator类的对象,这个对象可以使用foreach()函数进行迭代, 官方文档解释:yield提供了一种更容易的...
    99+
    2023-09-08
    数据库 php mysql
  • 如何使用PHP处理和打包大型数据文件?
    PHP作为一门广泛应用的编程语言,被广泛应用于Web开发。然而,当涉及到处理大型数据文件时,PHP可能会变得比较费力。本文将介绍如何使用PHP来处理和打包大型数据文件。 处理大型数据文件 当处理大型数据文件时,我们通常需要使用一些特殊的技术...
    99+
    2023-07-29
    打包 大数据 文件
  • 如何让PHP应用于大数据文件处理?
    PHP作为一种常用的服务器端脚本语言,很多人都知道它的应用范围非常广泛,但是对于如何在PHP中处理大数据文件,很多人可能并不是很清楚。本文将介绍如何在PHP中应用一些技巧,使得处理大数据文件变得更加高效。 一、使用流式处理 在PHP中,处理...
    99+
    2023-08-27
    大数据 编程算法 文件
  • 如何使用Python接口处理大数据文件?
    随着互联网的发展和科技的进步,数据量的增加已经成为了一个不可避免的趋势。在处理大数据时,Python已经成为了一种非常流行的语言,因为它具有易读易写、灵活和强大的数据处理能力等特点。本篇文章将介绍如何使用Python接口处理大数据文件。 ...
    99+
    2023-08-21
    接口 大数据 文件
  • 如何在PHP中使用打包技术处理大型数据文件?
    在PHP中处理大型数据文件是一项复杂的任务。这些文件可能包含数百万行数据,而传统的读取和写入方法可能会导致内存不足或处理速度慢的问题。为了解决这些问题,我们可以使用打包技术来处理大型数据文件。 打包技术是一种将数据压缩成一个文件的方法。这...
    99+
    2023-07-29
    打包 大数据 文件
  • 如何在PHP中使用大数据处理函数
    PHP是一种流行的开源脚本语言,常用于Web开发。随着大数据时代的到来,越来越多的开发人员需要使用PHP中的大数据处理函数来处理海量数据。本文将介绍如何在PHP中使用大数据处理函数。一、PHP中的大数据处理函数PHP中有许多用于处理大数据的...
    99+
    2023-05-19
    使用 PHP 大数据处理函数
  • 怎么使用php多线程处理大数据
    在 PHP 中,通常使用多进程来实现多线程的功能,这是因为 PHP 中的线程模型与其他编程语言不同。以下是一个使用多进程处理大数据的...
    99+
    2023-08-12
    php
  • 如何在Windows上使用PHP处理大数据?
    在Windows上使用PHP处理大数据是一项非常重要的任务。PHP是一种非常强大的服务器端脚本语言,它可以帮助我们轻松地处理大量的数据,包括数据的读取、处理和输出。在本文中,我们将介绍如何在Windows上使用PHP处理大数据,以及如何优化...
    99+
    2023-07-23
    windows 大数据 numy
  • 如何使用php函数来优化大数据处理?
    在当今大数据时代,处理海量数据已成为一项重要任务。PHP 是一种强大的服务器端编程语言,它提供了许多用于数据处理的函数和工具。本文将介绍一些优化大数据处理的方法,并提供具体的 PHP 代码示例。使用合适的数据结构:在处理大数据时,选择合适的...
    99+
    2023-10-21
    优化 大数据处理 PHP函数
  • Java如何处理大数据接口文件?
    随着互联网的发展,数据量的增大已经成为了当今时代的一个主要特征。在这种情况下,如何有效地处理大数据接口文件已经成为了一个亟需解决的问题。而Java作为一种广泛应用的编程语言,也提供了一系列处理大数据接口文件的解决方案。 一、Java处理大...
    99+
    2023-06-29
    大数据 接口 文件
  • PHP中的大数据处理
    随着互联网的发展和大数据技术的不断应用,服务器端脚本语言PHP也越来越受到广泛的关注。而PHP的优点不仅仅体现在它的易学易用上,还在于它能够处理大规模的数据,尤其是在大数据处理方面,PHP的能力也在不断增强。下面我们就来探讨一下PHP中的大...
    99+
    2023-05-23
    数据分析 PHP 大数据处理
  • 你知道如何使用Java处理大数据接口文件吗?
    当今,随着互联网和移动互联网的快速发展,数据量呈现爆炸式增长,数据处理也成为了一项极为重要的任务。而大数据接口文件的处理也成为了Java开发人员面临的一项重要挑战。本文将介绍如何使用Java处理大数据接口文件。 一、什么是大数据接口文件? ...
    99+
    2023-06-29
    大数据 接口 文件
  • 如何使用PHP中的UNIX文件函数处理文件?
    在PHP中,有很多函数可以用来处理文件。其中,UNIX文件函数是一类非常有用的函数,它们可以让你在PHP中像在UNIX操作系统中一样处理文件。 本文将介绍一些常用的UNIX文件函数,并演示它们的使用方法,帮助你更好地处理文件。 fope...
    99+
    2023-10-18
    unix 文件 函数
  • Windows系统下如何使用PHP处理大数据?
    在现代互联网的时代,我们经常需要处理大量的数据。对于PHP开发者来说,如何在Windows系统下高效地处理大量数据是一个常见的问题。在本文中,我们将介绍一些在Windows系统下使用PHP处理大数据的方法和技巧。 一、使用流式处理 当我们...
    99+
    2023-09-29
    load 大数据 windows
  • 如何在Linux上使用PHP处理大数据load?
    在Linux操作系统上,PHP是一种非常流行的编程语言,可以用于处理各种任务,包括处理大数据load。大数据处理是一项非常复杂的任务,需要使用一些高效的工具和技术来完成。在本文中,我们将介绍如何在Linux上使用PHP处理大数据load,并...
    99+
    2023-09-06
    linux 大数据 load
  • 如何使用PHP和Linux来处理大数据load?
    PHP和Linux是处理大数据load的强大工具。PHP是一种脚本语言,可用于处理数据和创建动态Web内容。Linux是一种操作系统,可用于处理大量数据和运行PHP脚本。本文将介绍如何使用PHP和Linux来处理大数据load。 使用PH...
    99+
    2023-09-06
    linux 大数据 load
  • Python:PDF文件处理(数据处理)
    工作中有对PDF文件进行数据抽取,现在总结归纳一下相应的方法,本文包括一下内容: PDF文件分割、拼接; PDF文件抽取图片,简单的图片识别; PDF文件抽取表格; PDF文件抽取文本; PDF文件转docx文件; docx文件...
    99+
    2023-09-03
    pdf python Powered by 金山文档
  • 如何利用Java文件响应来处理大数据?
    在现代互联网时代,数据已经成为了一种非常重要的资源。大量的数据需要被收集、存储、处理、分析和展示。在这些过程中,我们经常需要处理大量的数据,但是如果我们采用传统的方式,使用内存来处理大数据,很容易导致内存溢出的问题,从而导致程序运行崩溃。...
    99+
    2023-07-22
    文件 响应 大数据
  • 处理大数据文件时,PHP中的打包技术有哪些应用?
    随着互联网技术的不断发展,大数据的处理已经成为了当今互联网领域的重要技术之一。而PHP作为一门流行的服务器端脚本语言,也在大数据处理领域发挥着重要的作用。其中,打包技术是PHP中常用的一种大数据处理方式。本文将介绍PHP中的打包技术及其应用...
    99+
    2023-07-29
    打包 大数据 文件
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作