Shadow
PHP yield生成器的使用,占用非常少量的内存
直接上代码,模拟读取大数据csv文件
/**
* 采用 Yield生成器读取数据(推荐使用)
* @param $resoure
* @return Generator
*/
function readCsvByYield($resoure)
{
while (feof($resoure) === false) {
yield fgetcsv($resoure);
}
}
/**
* 采用 原始数组读取数据(不推荐,文件特别大,会导致内存移除!!!)
* @param $resoure
* @return array
*/
function readCsvByArray($resoure)
{
$readCsvDatas = [];
while (feof($resoure) === false) {
$readCsvDatas[] = fgetcsv($resoure);
}
return $readCsvDatas;
}
try {
//返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)
$startMemory = memory_get_usage();
$resoure = fopen('1.csv', 'rb');
$generator = readCsvByYield($resoure);
//$generator = readCsvByArray($resoure);
$endMemory = memory_get_usage();
//计算期间段使用了多少的内存
echo "<br/>=========<br/>总共使用内存:" . ($endMemory - $startMemory) / 1024 / 1024 . 'MB';
} catch (Exception $e) {
echo $e->getMessage();
}
文件 1.csv
里有 65536 行模拟数据
使用 readCsvByArray($resoure);
函数读取到内存中,可以看到占用了非常多的内存:
使用 readCsvByYield($resoure)
使用 yield 生成器读取,可以看到占用的内存非常少:
Dcr163的博客
http://dcr163.cn/647.html(转载时请注明本文出处及文章链接)