今天来优化下读取大文件,在 PHP 读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,今天采用 yield 来实现大文件的读取。yield生成器是php5.5之后出现的,yield提供了一种更容易的方法来实现简单的迭代对象,相比较定义类实现 Iterator 接口的方式,性能开销和复杂性大大降低。yield生成器允许你 在 foreach 代码块中写代码来迭代一组数据而不需要在内存中创建一个数组。

老式读取方式

function readLocalFile($fileName)

{

$handle = fopen($fileName, 'r');

$lins = [];

while (!feof($handle)) {

$lines[] = fgets($handle);

}

fclose($handle);

return $lines;

}

yield 读取方式

使用 yield 的特性,来读取大文件

function readYieldFile($fileName)

{

$handle = fopen($fileName, 'r');

while (!feof($handle)) {

yield fgets($handle);

}

fclose($handle);

}

辅助函数

为了便于测试,我们写一个读取内存的辅助函数

function formatBytes($bytes)

{

if ($bytes < 1024) {

return $bytes . "b";

} else if ($bytes < 1048576) {

return round($bytes / 1024, 2) . "kb";

}

return round($bytes / 1048576, 2) . 'mb';

}

测试

我这里准备了一个 7M 大小的文本文件来做测试。

# 第一种

readLocalFile('./all.txt');

echo formatBytes(memory_get_peak_usage());  // 结果为 7.59mb

# 第二种

$lines = readYieldFile('./all.txt');

foreach ($lines as $row) {}

echo formatBytes(memory_get_peak_usage());  // 结果为 137.79kb

php yield 导出文件,PHP yield 读取大文件相关推荐

  1. python读取大文件-使用Python读取大文件的方法

    背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...

  2. PHP 与Python 读取大文件的区别

    php读取大文件的方法 <?php function readFile($file) {# 打开文件$handle = fopen($file, 'rb');while (feof($handl ...

  3. php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件

    PHP读取大文件源码示例,通过PHP读取过大.超大型文件的思路及解决方案. 在日常读取文件时,若文件 不是很大,通常使用file_get_contents,将内容一次性载入的变量中,也可以远程加载网页 ...

  4. 转载好文 php读取大文件

    本文转载自https://www.luyuqiang.com/how-php-read-a-large-file 起因 这是偶然间看到的一篇文章,感觉收获颇丰,故转载.转载自芦雨强的网络日志 干货分割 ...

  5. 使用python读取大文件

    读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容. python读取大文件通常两种方法:第一种是利用yield生成器读取:第二种是:利用open( ...

  6. python 读取大文件

    python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...

  7. 如何在不会导致服务器宕机的情况下,用 PHP 读取大文件

    来自:开源中国 www.oschina.net/translate/performant-reading-big-files-php 作为PHP开发人员,我们并不经常需要担心内存管理.PHP 引擎在我 ...

  8. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...

  9. Windows/Linux上使用fopen相关函数读取大文件

    在介绍读取大文件之前,先了解下<cstdint>文件,标准头文件,存放固定宽度整数类型,如int32_t, uint32_t,不管在32位上还是64位上,长度都为4个字节:int64_t, ...

最新文章

  1. DLT645规约学习笔记
  2. python支持的数据类型list_Python基本数据类型之list
  3. 常看 Shell: 文本文件操作
  4. 【STM32】定时器中断实验代码详解
  5. wordpress 拾遗
  6. 十二个 ASP.NET Core 例子
  7. 某公司R2631E以太口通过SDH接新桥的ATM交换机,出现丢包问题的解决方法
  8. python文本提取序列信息_从fasta文件中通过头中的ID号提取序列
  9. spring boot +spring security + jwt 实现认证模块
  10. puppet成长日记四 Exec资源详细介绍及案例分析
  11. MWeb 博客生成软件如何使用“发布脚本”发布网站?
  12. 在word中打出带圈的数字,文字以及其它字符
  13. 耳机及音响--煲机软件
  14. 基于Web在线考试系统的设计与实现
  15. 带你认识世界最值钱的十种货币
  16. LOL手游登上去服务器维护,lol手游进不去怎么回事?无法登陆解决方法
  17. 安装sikuli报错:jnius/jnius_conversion.pxi:54:31: Casting temporary Python object to non-numeric non-Pyth
  18. python中字符串
  19. 正宗干货!关于Apple Watch官方提到的10个设计小技巧
  20. Spark RDD 论文详解(四)表达 RDDs

热门文章

  1. Chrome 开发者工具的各种骚技巧
  2. 如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布?
  3. 【SpringCloud】Zuul-实例
  4. SpringMVC注解@RequestParam(value=xxxx,required=false)解释
  5. 从UV位置图获得3D人脸
  6. opencv检测黑色区域
  7. cmake find_package opencv 找不到
  8. pytorch 查看gpu cuda版本
  9. java 写文件的三种方法比较
  10. PMP-【第6章 项目进度管理】-2021-2-11(136页-160页)