我有一个10MB的文本文件 线条的长度可能会有所不同。
从这个文件中只读取一个特定行,哪种方法最快(快速且内存友好)?例如get_me_the_line($nr, $file_resource)
答案 0 :(得分:6)
如果线条长度不同,我不知道只是跳到线上的方法。但是,如果不将它们用于任何事情,您可以非常快速地遍历行,并返回感兴趣的行。
function ReadLineNumber($file, $number)
{
$handle = fopen($file, "r");
$i = 0;
while (fgets($handle) && $i < $number - 1)
$i++;
return fgets($handle);
}
修改强>
我将- 1
添加到循环中,因为它会提前读取一行。因此$number
是零索引线参考。如果您更喜欢第1行,则更改为- 2
表示文件中的第一行。
答案 1 :(得分:2)
由于线条的长度不同,您必须查看每个字符,因为它可能表示该行的结尾。最快的方法是将文件加载到大小与文件系统的块大小相同的块中,并计算换行符,直到您在所需的行上。 更好的方法是拥有一个索引文件,用于存储有关包含这些行的文件的信息。使用数据库也可能是一个更好的主意。
答案 2 :(得分:1)
如果文件非常大(几GB或更多)并且您的应用程序在* nix上运行,您可能不想要尝试让PHP处理该文件,而是使用一些现有的针对其优化的unix工具这种线路处理。一旦此类工具为sed
,就可以找到从大文件中打印特定行的示例here。
在system_exec()
调用中包装它应该是微不足道的,或者类似于编写你正在寻找的函数。