php yield 导出文件,PHP yield 读取大文件
今天来优化下读取大文件,在 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 读取大文件相关推荐
- python读取大文件-使用Python读取大文件的方法
背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方法,本文将介绍这两种读取方法. 准备工作 ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) {# 打开文件$handle = fopen($file, 'rb');while (feof($handl ...
- php并发取源码,PHP读取大文件源码示例-Swoole多进程读取大文件
PHP读取大文件源码示例,通过PHP读取过大.超大型文件的思路及解决方案. 在日常读取文件时,若文件 不是很大,通常使用file_get_contents,将内容一次性载入的变量中,也可以远程加载网页 ...
- 转载好文 php读取大文件
本文转载自https://www.luyuqiang.com/how-php-read-a-large-file 起因 这是偶然间看到的一篇文章,感觉收获颇丰,故转载.转载自芦雨强的网络日志 干货分割 ...
- 使用python读取大文件
读取文件时,如果文件过大,则一次读取全部内容到内存,容易造成内存不足,所以要对大文件进行批量的读取内容. python读取大文件通常两种方法:第一种是利用yield生成器读取:第二种是:利用open( ...
- python 读取大文件
python 读取大文件 python读取文件一般情况是利用open()函数以及read()函数来完成: f = open(filename,'r') f.read() 这种方法读取小文件,即读取大小 ...
- 如何在不会导致服务器宕机的情况下,用 PHP 读取大文件
来自:开源中国 www.oschina.net/translate/performant-reading-big-files-php 作为PHP开发人员,我们并不经常需要担心内存管理.PHP 引擎在我 ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...
- Windows/Linux上使用fopen相关函数读取大文件
在介绍读取大文件之前,先了解下<cstdint>文件,标准头文件,存放固定宽度整数类型,如int32_t, uint32_t,不管在32位上还是64位上,长度都为4个字节:int64_t, ...
最新文章
- DLT645规约学习笔记
- python支持的数据类型list_Python基本数据类型之list
- 常看 Shell: 文本文件操作
- 【STM32】定时器中断实验代码详解
- wordpress 拾遗
- 十二个 ASP.NET Core 例子
- 某公司R2631E以太口通过SDH接新桥的ATM交换机,出现丢包问题的解决方法
- python文本提取序列信息_从fasta文件中通过头中的ID号提取序列
- spring boot +spring security + jwt 实现认证模块
- puppet成长日记四 Exec资源详细介绍及案例分析
- MWeb 博客生成软件如何使用“发布脚本”发布网站?
- 在word中打出带圈的数字,文字以及其它字符
- 耳机及音响--煲机软件
- 基于Web在线考试系统的设计与实现
- 带你认识世界最值钱的十种货币
- LOL手游登上去服务器维护,lol手游进不去怎么回事?无法登陆解决方法
- 安装sikuli报错:jnius/jnius_conversion.pxi:54:31: Casting temporary Python object to non-numeric non-Pyth
- python中字符串
- 正宗干货!关于Apple Watch官方提到的10个设计小技巧
- Spark RDD 论文详解(四)表达 RDDs
热门文章
- Chrome 开发者工具的各种骚技巧
- 如何使用 Spinnaker 和 Kubernetes 进行数据库变更发布?
- 【SpringCloud】Zuul-实例
- SpringMVC注解@RequestParam(value=xxxx,required=false)解释
- 从UV位置图获得3D人脸
- opencv检测黑色区域
- cmake find_package opencv 找不到
- pytorch 查看gpu cuda版本
- java 写文件的三种方法比较
- PMP-【第6章 项目进度管理】-2021-2-11(136页-160页)