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的执行速度几乎是前者的两倍。