Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:读取大文件中的特定行(不逐行读取)_Php_File Io - Fatal编程技术网

PHP:读取大文件中的特定行(不逐行读取)

PHP:读取大文件中的特定行(不逐行读取),php,file-io,Php,File Io,我有以下文件结构: line1 (number or a a short string) line2 (can be several MB of text) ; line1 line2 ; line1 line2 ; ... 总文件大小超过100MB,因此每次逐行读取都相当慢。 我只想读取每个块的“line1”,跳过所有的“line2”。或者只是读一行,我知道行号。有什么方法可以用php实现吗?阅读行的标准方法是将行存储在内存中,这种结构的效果不太好 (我知道数据库结构会有更好的用途,但这是一

我有以下文件结构:

line1 (number or a a short string)
line2 (can be several MB of text)
;
line1
line2
;
line1
line2
;
...
总文件大小超过100MB,因此每次逐行读取都相当慢。 我只想读取每个块的“line1”,跳过所有的“line2”。或者只是读一行,我知道行号。有什么方法可以用php实现吗?阅读行的标准方法是将行存储在内存中,这种结构的效果不太好

(我知道数据库结构会有更好的用途,但这是一个我真正想要解决的研究案例。)

使用splfileobject

  • 无需逐行阅读所有行

  • 可以“跳转”到所需的行吗

如果您知道行号:

//lets say you need line 4
$myLine = 4 ; 
$file = new SplFileObject('bigFile.txt');
//this is zero based so need to subtract 1
$file->seek($myLine-1);
//now print the line
echo $file->current();
退房:

如果文件是静态文件,请为其建立行指针索引。^。扫描文件(以较小的块)以查找每行换行符的位置,然后可以返回并更轻松地扫描每行开头的几个字符。预处理是你的朋友。你的PHP进程有多大?比如说,你可以把它分成2000万块,然后扫描五次。这比逐行读取要快得多。您可以尝试
SplFileObject
,它可以每三行读取一行,而无需加载其他2您是否在windows或linux上运行?卓越!我做了一些基准测试,这项工作做得非常好。在一个100MB的文件上,需要0.52μs才能找到最后一行。逐行读取需要0.97μs来执行相同的任务。执行时间与行数成线性关系,但splfileobject的执行速度几乎是前者的两倍。