【问题标题】:Reading a file line by line for large files efficiently in PHP?在 PHP 中有效地逐行读取大文件?
【发布时间】:2014-03-17 05:32:13
【问题描述】:

我的应用读取了一个 5MB - 10MB 的大文件,该文件已使用 json 条目逐行输入。

每一行都由一个解析器处理,该解析器被馈送到多个解析器并分别处理。一旦文件被读取,文件就会被移动。程序不断收到要处理的文件。

该程序目前适用于@file_get_contents($filename)。该程序的结构按原样运行。

问题是file_get_contents 将整个文件加载为一个数组,整个系统运行了一分钟。我怀疑如果我逐行阅读它而不是等待文件加载到内存中,我可以提高速度(我可能是错的并且愿意接受建议)。

执行此操作的文件处理程序太多。实现我需要的最有效方法是什么,哪种文件读取方法最适合?

我有fopenfreadreadfilefilefscanf 来应对我的头顶。但是,当我为他们阅读 man 时 - 它的所有代码都用于读取通用文件,而没有明确指示什么最适合较大的文件。

【问题讨论】:

标签: php performance


【解决方案1】:
$file = fopen("file.json", "r");

if ($file)
{
    while (($line = fgets($file)) !== false) 
    {
        echo $line;
    }
}
else 
{
    echo "Unable to open the file";
}

Fgets 读取直到它到达 EOL 或 EOF。如果你愿意,你可以使用第二个参数添加它应该读取多少。

有关 fget 的更多信息:http://us3.php.net/fgets

【讨论】:

  • 好的,但它是读取大文件和单行文件中最有效的方法吗?是什么使它与 fread 或 readfile...等不同且更有效
  • 当您需要阅读每一行而不将它们保存在内存中时,这是最好的方法。另一种方法是使用 fread,但它是相同的,我从未注意到任何差异(好吧,我发现 fgets 也更容易编写,但它是我)也许其他人会发布一个 fread 版本,我现在不能抱歉。
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2019-06-26
  • 2011-12-22
相关资源
最近更新 更多