我刚刚发现我的脚本给了我一个致命的错误:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 440 bytes) in C:\process_txt.php on line 109
这行是这样的:
$lines = count(file($path)) - 1;
所以我认为将文件加载到内存中并计算行数有困难,有没有更有效的方法可以在不出现内存问题的情况下做到这一点?
我需要计算行数的文本文件大小从2MB到500MB。也许有时是一场演出。
感谢所有人的帮助。
发布于 2010-01-29 22:31:43
这将使用较少的内存,因为它不会将整个文件加载到内存中:
$file="largefile.txt";
$linecount = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle);
$linecount++;
}
fclose($handle);
echo $linecount;
fgets
将一行加载到内存中(如果省略了第二个参数$length
,它将一直从流中读取,直到到达行尾,这正是我们想要的)。如果您关心挂载时间和内存使用率,这仍然不太可能像使用PHP以外的其他工具一样快。
唯一的危险是如果有任何行特别长(如果您遇到一个2 2GB的文件没有换行符怎么办?)。在这种情况下,您最好将其分成块,并计算行尾字符:
$file="largefile.txt";
$linecount = 0;
$handle = fopen($file, "r");
while(!feof($handle)){
$line = fgets($handle, 4096);
$linecount = $linecount + substr_count($line, PHP_EOL);
}
fclose($handle);
echo $linecount;
发布于 2015-07-24 21:18:03
简单的面向对象解决方案
$file = new \SplFileObject('file.extension');
while($file->valid()) $file->fgets();
var_dump($file->key());
#更新
另一种方法是在SplFileObject::seek
方法中使用PHP_INT_MAX
。
$file = new \SplFileObject('file.extension', 'r');
$file->seek(PHP_INT_MAX);
echo $file->key();
发布于 2010-01-29 22:30:03
如果您在Linux/Unix主机上运行此命令,最简单的解决方案是使用exec()
或类似的命令来运行wc -l $path
。只需确保您已经清理了文件,以确保它不是类似于“/ $path
/ to /file;rm -rf /”的内容。
https://stackoverflow.com/questions/2162497
复制相似问题