PHP 循环巨大的文本文件非常慢,你能改进吗?

标签 php performance loops

文本文件(实际上是 .dat)中包含的数据如下所示:

LIN*1234*UP*abcde*33*0*EA
LIN*5678*UP*fghij*33*0*EA
LIN*9101*UP*klmno*33*23*EA

文件中实际上有超过 500,000 行这样的行。

这是我现在使用的:

//retrieve file once        
$file = file_get_contents('/data.dat'); 
$file = explode('LIN', $file);

    ...some code

foreach ($list as $item) { //an array containing 10 items
     foreach($file as $line) { //checking if these items are on huge list
         $info = explode('*', $line);
         if ($line[3] == $item[0]) {
             ...do stuff...                     
             break; //stop checking if found
          }
      }         
 }

问题是它运行得太慢——每次迭代大约需要 1.5 秒。我单独确认,影响速度的不是“...do stuff...”。相反,它是寻找正确的项目。

如何加快速度?谢谢。

最佳答案

如果每个项目都在自己的行上,则最好使用 fgets() 代替将整个项目加载到内存中:

$f = fopen('text.txt', 'rt');

while (!feof($f)) {
    $line = rtrim(fgets($f), "\r\n");
    $info = explode('*', $line);
    // etc.
}

fclose($f);

PHP 文件流经过缓冲(~8kB),因此在性能方面应该不错。

另一段逻辑可以像这样重写(而不是多次迭代文件):

if (in_array($info[3], $items)) // look up $info[3] inside the array of 10 things

或者,如果 $items 已适当索引:

if (isset($items[$info[3]])) { ... }

关于PHP 循环巨大的文本文件非常慢,你能改进吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24443851/

相关文章:

php - array_multisort - 不对我的完整表格进行排序

php - 保存图片的php代码

php - 你会因为保存tinyMCE、QuillJS等文本编辑器生成的HTML代码而被黑客攻击吗?

javascript - 如何检查和测试 JavaScript 应用程序泄漏了多少内存

c++ - 在磁盘 C++ 上存储科学数据集的最佳方法

regex - AvalonEdit:复制大型突出显示的文本文件需要很长时间

javascript - 基于 javascript 函数的迭代的替代方案(例如 jQuery.each())

vba - 循环遍历行以将值均匀地拆分到新的电子表格中

javascript - 如何在javascript中使用循环获取十六进制颜色数字的完整列表

php - 如何在 Silex 中为一个请求定义多个路由?