zoukankan      html  css  js  c++  java
  • 使用 yield 减少内存消耗

    php 里面想要处理一个文本文件,有一个方法是使用 file() 函数,但是这个函数会读取文件所有内容,可能会导致占用很大内存。

    // 28.1 M 的文本文件, 200w 行
    $file = 'storage/logs/runningtime/2019-03-17.log';
    
    $file = file($file);
    
    // 219.28M
    dd(round(memory_get_usage() / 1024 / 1024, 2) . 'M');

    但是我们可以以另外一种方式处理,使用 fgets 逐行读取,逐行处理。

    // 28.1 M 的文本文件, 200w 行
    $file = 'storage/logs/runningtime/2019-03-17.log';
    
    $fp = fopen($file, 'r');
    while (($line = fgets($fp)) !== false) {
        // do something
    }
    
    // 1.87M
    dd(round(memory_get_usage() / 1024 / 1024, 2) . 'M');

    现在,我们也有另外一种选择,使用 yield 关键字,用法如下:

    // 28.1 M 的文本文件, 200w 行
    $file = 'storage/logs/runningtime/2019-03-17.log';
    
    function generator($file)
    {
        $fp = fopen($file, 'r');
        while (($line = fgets($fp)) !== false) {
            yield $line;
        }
        fclose($fp);
    }
    
    foreach (generator($file) as $line) {
        // do something
    }
    
    // 1.86M
    dd(round(memory_get_usage() / 1024 / 1024, 2) . 'M');
  • 相关阅读:
    docker参数--restart=always的作用
    docker参数expose使用
    Linux主机添加路由和端口转发
    docker自动开启端口转发功能
    【Tips】【UE】总结自己常用的UltraEdit使用技巧
    浅谈I2C总线
    I2C总线简介(很经典)
    ECN
    视频编码未来简史
    爬虫与反爬虫
  • 原文地址:https://www.cnblogs.com/eleven24/p/10549542.html
Copyright © 2011-2022 走看看