使用PHP在“块”中读取文件

时间:2013-04-25 00:25:09

标签: php regex

通过相对较小的数据块在php中读取文件的最佳方法是什么?

例如,读取5MB然后释放该内存并读取另外5MB

我在php中编写一个解析工具,需要读取一个巨大的文件并将其转换为CSV格式。

我的问题是我经常超出允许的内存限制,并且在我的环境中提升它不是一个选项。

这是完成工作的代码的一部分:

$i = 0;
$fileName = "test.txt";
$file = fopen($fileName,'r');

while($i <= 2000) {
    $line = fgets($file);
    $streetsheet[$i] = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY);
    ++$i;
}

fclose($file);
$fp = fopen('result.csv','w');

foreach($streetsheet as $key=>$value) {
    fputcsv($fp, $value);
}

例如,在上面显示的剪辑中,我正在读取文件的前2000行,并且它工作得很好。

当我将条件更改为

时会出现问题

while(!feof($file)){\*....*\}

它立即告诉我,我已超出允许的内存限制,然后它告诉我导致问题的行是我正在使用preg_split的行。

所以我想知道读取文件的最佳方式是什么?一次说1000行?

谢谢!

如果你要进行downvote,至少要有共同的礼貌来解释原因

1 个答案:

答案 0 :(得分:2)

你已经已经在“部分”中阅读:你正在逐行阅读它。问题是你将所有的行都粘贴到一个数组中然后转储数组。

相反,读取一行并输出一行并完全跳过该数组:

$fileName = "test.txt";
$file = fopen($fileName,'r');
$fp = fopen('result.csv','w');

while(!feof($file)) {
    $line = fgets($file);
    $value = preg_split('@\ @',$line,NULL, PREG_SPLIT_NO_EMPTY);
    fputcsv($fp, $value);
}

fclose($file);
fclose($fp);