文本文件(实际上是 .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/