一个文件有十万行数据,如何以 最小的内存 和 最快的速度 读取最后6行的内容?

PHP 算法面试题
0
0
分享
推荐答案
展示答案

<?php $path = __DIR__ . '/tmp/bigfile.txt'; echo getLastLines($path, 6); /* Output: line 9995 line 9996 line 9997 line 9998 line 9999 line 10000 */ function getLastLines($filename, $number) {     //尝试打开文件,如果文件不存在,则返回 false     if (!$fp = fopen($filename, 'r')) {         return false;     }     //从后向前查找,起始位置为倒数第 2 个字符     $pos = -2;     //暂存换行符,以检查指针是否在每一行的结尾     $eof = '';     //保存查找结果     $str = '';     //查找n行     while ($number > 0) {         //如果当前字符不是换行符,则继续向前查找         while ($eof != "\n") {             //从结尾开始查找             if (!fseek($fp, $pos, SEEK_END)) {                 //取得当前字符                 $eof = fgetc($fp);                 //位置向前移动                 $pos--;             } else {                 //如果当前字符是换行符,则退出内循环                 break;             }         }         //取出一行内容         $str = fgets($fp) . $str;         //初始化变量         $eof = '';         //继续向前查找         $number--;     }     return $str; } //通过php标准库中的文件处理类 // function getLastLines($filename, $number) // { //     $file = new SplFileObject($filename); //     //移动到结尾 //     $file->seek(PHP_INT_MAX); //     //结尾的key即为文件行数 //     $line_num = $file->key(); //     $str = ''; //     while ($number > 0) { //         $file->seek($line_num - $number); //         $str .= $file->current(); //         $number--; //     } //     return $str; // }

答案已隐藏