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');
  • 相关阅读:
    C# FileStream 文件复制
    DataSnap Server 客户端调用 异常
    抛出异常 exception
    RAD Tokyo 10.2.2
    delphi ios info.plist
    sql 日期格式
    sql server 2014登录账号
    sql server导入excel数据
    dev16 cxgrid 在DLL里报0地址错
    sql server 查看所有表记录数
  • 原文地址:https://www.cnblogs.com/eleven24/p/10549542.html
Copyright © 2011-2022 走看看