4

通过相对较小的数据块在 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 行?

谢谢!

如果您要投反对票,至少要有礼貌地解释原因

4

1 回答 1

3

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

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

$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);
于 2013-04-25T00:30:51.113 回答