TypechoJoeTheme

Dcr163的博客

统计

PHP yield生成器的使用,占用非常少量的内存

2022-05-13
/
0 评论
/
1,057 阅读
/
正在检测是否收录...
05/13

直接上代码,模拟读取大数据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 生成器读取,可以看到占用的内存非常少:

朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

https://dcr163.cn/647.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. William Tardent
    2024-02-27
  2. Maryann Hamer
    2024-02-27
  3. Sanora Pantano
    2024-02-24
  4. aa
    2024-02-21
  5. Kassie Baum
    2024-01-28

标签云