用php协程处理文件和常规分析文件的使用内存比较

$file = "example.txt";   //10万行数据

功能:读取文件中的每一行并输出

方法一:常规方法

  $fp = fopen($file,"r");
  while(!feof($fp)){
      $line = fgets($fp,1024);
    
  }
  fclose($fp);

  使用内存:240 byte

方法二:使用协程

  function getline($file){
      $fp = fopen($file,"r");
      while(!feof($fp)){
          $line = fgets($fp,1024);
          yield $line;
      }
      fclose($fp);
  }
  foreach(getline("example.txt") as $n=>$line){
    
  }

  使用内存:216 byte

从这个简单的例子可以看出,使用协程处理文件大约可以节省10%的内存分配,特别是在一些大的数组处理方面也可以尝试使用。

时间: 2025-01-21 19:22:32

用php协程处理文件和常规分析文件的使用内存比较的相关文章

关于协程:nodejs和golang协程的不同

nodejs和golang都是支持协程的,从表现上来看,nodejs对于协程的支持在于async/await,golang对协程的支持在于goroutine.关于协程的话题,简单来说,可以看作是非抢占式的轻量级线程. 协程本身 一句话概括,上面提到了 "可以看作是非抢占式的轻量级线程". 在多线程中,把一段代码放在一个线程中执行,cpu会自动将代码分成碎片,并在一定时间切换cpu控制权,线程通过锁机制确保自己使用的资源在cpu执行别的线程的代码时被修改(占用的内存堆栈.硬盘数据资源等)

最轻量级的C协程库:Protothreads

@20150228 http://blog.csdn.net/weiwangchao_/article/details/7777385 协程的好处不用再多说,作为与函数调用/返回相对的概念,它使我们思考问题的方式经历一场变革.现在我们关注的是C,由于C本身的特质,将协程引入其中将会是一 个挑战.无数先驱已经为这个目标抛了头颅洒了热血,于是我们有了libtask之类.而这里提到的,是一个堪称最轻量级的协程实现:Protothreads(主页:http://www.sics.se/~adam/pt/

Python函数进阶:闭包、装饰器、生成器、协程

返回目录 本篇索引 (1)闭包 (2)装饰器 (3)生成器 (4)协程 (1)闭包 闭包(closure)是很多现代编程语言都有的特点,像C++.Java.JavaScript等都实现或部分实现了闭包功能,很多高级应用都会依靠闭包实现. 一般专业文献上对闭包的定义都比较拗口,比如:“将组成函数的语句和这些语句的执行环境打包在一起时,得到的对象称为闭包.” 其实,简单来说,你可以将闭包看成是一个轻载的类,这个类只有一个函数方法,并且只有为数不多的几个成员变量. 闭包的优点是:实现起来比类稍微轻巧一

菜鸟系列Golang学习 — 协程

Golang 协程介绍 1. 用户态和内核态 内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序. 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取. 1.1 为什么要有用户态和内核态? 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态和内核态. 2. 进程.线程.协程 进程

05文件、线程、进程、协程

一. 文件 1.    操作文件的函数/方法 1) open打开文件 open默认只读模式 当要修改,调用write方法时,可以传入访问方式 f=open("文件名","访问方式") 2) read将文件内容读取到内存 第一次读取之后,文件指针到了文件末尾,再次调用不会读取到任何的内容 3) write将指定内容写入文件 4) close 关闭文件 5) readLine方法:一次读取一行 方法执行后,会把 文件指针 移动到下一行,准备再次读取 2.    其他常用

Unity下载文件一(www协程下载)

下载功能,是大多数游戏或者软件都需具备的一个基础模块,但是很多人却没有机会去写这个完整功能. 那么我就分享下我写该功能时的随笔整理 本文只说www协程下载,http的同步和异步下载放到下篇 这个简单: WWW wwwServer = new WWW("http://192.168.1.1:8080/Files/ab.assetBundle"); yield return wwwServer; if (string.IsNullOrEmpty(wwwServer.error)) { As

Gevent的socket协程安全性分析

一般讨论socket的并发安全性,都是指线程的安全性...而且绝大多数的情况下socket都不是线程安全的.. 当然一些框架可能会对socket进行一层封装,让其成为线程安全的...例如java的netty框架就是如此,将socket封装成channel,然后让channel封闭到一个线程中,那么这个channel的所有的读写都在它所在的线程中串行的进行,那么自然也就是线程安全的了..... 其实很早看Gevent的源码的时候,就已经看过这部分的东西了,当时就已经知道gevent的socket不

python并发编程之---协程

1.什么是协程 协程:是单线程下的并发,又称微线程,纤程. 协程是一种用户态的轻量级线程,协程是由用户程序自己控制调度的. 2.需要注意的点: 需要强调的是: #1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) #2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点

进程、线程和协程的区别

进程: 进程之间不共享任何状态,进程的调度由操作系统完成,每个进程都有自己独立的内存空间,进程间通讯主要是通过信号传递的方式来实现的,实现方式有多种,信号量.管道.事件等,任何一种方式的通讯效率都需要过内核,导致通讯效率比较低.由于是独立的内存空间,上下文切换的时候需要保存先调用栈的信息.cpu各寄存器的信息.虚拟内存.以及打开的相关句柄等信息,所以导致上下文进程间切换开销很大,通讯麻烦. 线程: 线程之间共享变量,解决了通讯麻烦的问题,但是对于变量的访问需要锁,线程的调度主要也是有操作系统完成