首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有效地计算文本文件的行数。(200mb+)

有效地计算文本文件的行数。(200mb+)
EN

Stack Overflow用户
提问于 2010-01-29 22:26:11
回答 15查看 170.7K关注 0票数 97

我刚刚发现我的脚本给了我一个致命的错误:

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。也许有时是一场演出。

感谢所有人的帮助。

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 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;
票数 175
EN

Stack Overflow用户

发布于 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(); 
票数 61
EN

Stack Overflow用户

发布于 2010-01-29 22:30:03

如果您在Linux/Unix主机上运行此命令,最简单的解决方案是使用exec()或类似的命令来运行wc -l $path。只需确保您已经清理了文件,以确保它不是类似于“/ $path / to /file;rm -rf /”的内容。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2162497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档