2

我有一个包含绘图数据的文件。每行总共有 4 个坐标,数据文件可以超过 1 GB。比方说,我想获取数据文件中的第三列,哪种方法应该考虑好的做法并且更快?

使用执行:

exec("awk '{ print $3 }' data", $output);

使用 PHP 脚本:

$data = file("data");
$points = array();
foreach($data as $line)
    $points[] = $line[2];

此外,由于服务器不允许读取大文件,所以我必须使用 fread 来分几个部分读取文件。但是 fread 不够聪明,必须做一些工作来合并每个部分的最后一行。有什么建议或更好的方法来读取 php 文件中的列吗?

4

2 回答 2

3

/file是一个 3.1 GB 的大文件:

root# time awk '{ print $3 }' /file >/dev/null

real   1m42.430s
user   1m0.241s
sys    0m2.198s

好的。awk 为 ±1.7 分钟。让我们测试一下 PHP(没有字段拆分,只有第三个字符):

root# time php -r '$fp = fopen("/file", "r"); while (($buf = fgets($fp)) !== false) echo $buf[2]; fclose($fp);' >/dev/null

real   4m17.322s
user   3m16.571s
sys    0m31.625s

PHP ±4.3 分钟!我不想想象如果我使用@Jack 的代码需要多长时间......

PHP 比awk. 在非常大的文件上,使用 awk(由 exec() 调用)。正如您在此处看到的,PHP 在用户空间中花费了大量时间(是 awk 的三倍)。

于 2013-07-22T09:13:03.880 回答
0

fgets 是你的朋友 -http://ie.php.net/fgets。您可以逐行读取文件,而无需将整个文件加载到内存中。

于 2013-07-22T08:56:58.807 回答