php读取超大文件(使用yield生成器)

PHP 在 5.5 版本中引入了「生成器(Generator)」特性,不过这个特性并没有引起人们的注意。正好最近有读取大文件的需求,大概有14GB左右。

<?php

function getLines($file) {
    $f = fopen($file, 'r');
    try {
        while ($line = fgets($f)) {
            yield $line;
        }
    } finally {
        fclose($f);
    }
}

foreach (getLines("logs.log") as $n => $line) {
    //逐行内容
    echo $line;
    //行数
    var_dump($n);
}

每行字符30个左右纯文本文件,完全读取一遍:

  • 在我的台式机Intel(R) Core(TM) i5-8400 CPU @ 2.80GHz 2.81 GHz (6核)CPU 20% 左右,耗时122s
  • 在小服务器Intel Xeon Processor (Cascadelake) (1核)CPU 100% 左右,耗时397s

查询还在接受范围内。

参考:https://www.jianshu.com/p/2751e5d7b259

Author: thinkwei

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注